首页 > 运维 > linux运维 > 正文

Linux系统开发: 学习linux三剑客(awk、sed、grep)(下)

看不見的法師
发布: 2025-07-19 08:26:28
原创
928人浏览过

linux系统开发: 学习linux三剑客(awk、sed、grep)(下)

一、前言

这篇文章是 linux三剑客(awk、sed、grep)(上)>的续集。

二、awk命令2.1 awk命令基本使用介绍

awk是它的三个作者姓氏的首字母合写,他们是:Aho(阿尔佛雷德·艾侯)、Winberger(彼得·温伯格)和Kernighan(布莱恩·柯林汉),他们三人合著《AWK程式设计》。

awk是一种文本处理工具,同时它也是一门微型编程语言,它的目的是编写小巧 但充满表达力的程序,把文本的输入变换为文本的输出。用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

现今的Linux发行版所附带的awk实际上很新,是GNU的重写版本,也叫GNU awk,程序名是gawk。

立即进入豆包AI人工智官网入口”;

立即学习豆包AI人工智能在线问答入口”;

awk命令格式和选项、语法形式:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">awk [options]  'script'  var=value file(s)  awk [options]  -f scriptfile  var=value file(s)</code>
登录后复制

常用选项:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">-F fs   fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: -v var=value   赋值一个用户定义变量,将外部变量传递给awk -f scripfile  从脚本文件中读取awk命令 -m[fr] val   对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用</code>
登录后复制

awk的核心思想是模式和行为操作,也叫模式驱动编程。模式一般是关系或正则表达式,用于与输入的每条记录进行匹配;而行为操作则是对模式匹配到的记录的处理方法,采用与C类似的语法,并由一对大括号“{}”括起来。

模式

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">/正则表达式/:使用通配符的扩展集。 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 模式匹配表达式:用运算符~(匹配)和~!(不匹配)。 BEGIN语句块、pattern语句块、END语句块</code>
登录后复制

行为操作

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是:变量或数组赋值输出命令内置函数控制流语句</code>
登录后复制

awk脚本基本结构

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">awk  'BEGIN{ commands } pattern{ commands } END{ commands }'  file</code>
登录后复制

一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中。

示例:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">例如:awk  'BEGIN{ i=0 } { i++ } END{ print i }' filenameawk  "BEGIN{ i=0 } { i++ } END{ print i }" filename</code>
登录后复制

awk的工作原理

第一步:执行BEGIN{ commands }语句块中的语句;

第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。

第三步:当读至输入流末尾时,执行END{ commands }语句块。

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

pattern语句块中的通用命令是最重要的部分,它也是可选的。如果省略模式,则行为将被应用到每条输入记录;如果省略行为,则默认操作是在标准输出上打印匹配到的记录,执行{ print }。

豆包爱学
豆包爱学

豆包旗下AI学习应用

豆包爱学674
查看详情 豆包爱学

awk程序的pattern语句块有以下三种情况:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">awk  'pattern    {undefinedcommands }'     #如果模式匹配,则执行行为awk  'pattern           '         #如果模式匹配,则在标准输出上打印记录执行{ print }awk  '           {commands }'    # 针对每条记录,执行行为。</code>
登录后复制

示例:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">$ echo  -e "hello \n my baymax " | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'  #完整的结构#-e参数表示echo内可使用转义字符$ echo  -e "hello \n my baymax " | awk 'BEGIN{ print "Start" } { print } '  #省略end结构$ echo -e "hello \n my baymax " | awk ' { print } '                      #省略前后结构$ echo  -e "hello \n my baymax " | awk ' { print } END{ print "End" }'     #省略begin结构</code>
登录后复制

当使用不带参数的print时,它就打印当前行,当print的参数是以逗号进行分隔时,打印时则以空格作为定界符。例如:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">$echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }'v1 v2 v3</code>
登录后复制

在awk的print语句块中双引号是被当作拼接符使用:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'</code>
登录后复制

v1=v2=v3

{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放在END语句块中。

awk内置变量(预定义变量)

说明:[A][N][P][G]表示第一个支持变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。 字段是用空格隔开的单词段。$0 这个变量包含执行过程中当前行的文本内容。[A] NF 表示字段数,在执行过程中对应于当前的字段数。而$NF则表示一行中的最后一个字段。$(NF-n)则表示一行中的倒数第n个字段,n为正整数。[A] NR 表示记录数,在执行过程中对应于当前的行号。[A] OFMT 数字的输出格式(默认值是%.6g)。[A] OFS 输出字段分隔符(默认值是一个空格)。[A] ORS 输出记录分隔符(默认值是一个换行符)。[A] RS 记录分隔符(默认是一个换行符)。[A] FILENAME 当前输入文件的名。[A] FS 字段分隔符(默认是任何空格)。[G] ARGIND 命令行中当前文件的位置(从0开始算)。[G] CONVFMT 数字转换格式(默认值为%.6g)。[G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。[G] IGNORECASE 如果为真,则进行忽略大小写的匹配。[N] RSTART 由match函数所匹配的字符串的第一个位置。[N] RLENGTH 由match函数所匹配的字符串的长度。[N] SUBSEP 数组下标分隔符(默认值是34)。[N] ARGV 包含命令行参数的数组。[N] ARGC 命令行参数的数目。[N] ERRNO 最后一个系统错误的描述。[P] ENVIRON 环境变量关联数组。[P] FNR 同NR,但相对于当前文件。</code>
登录后复制

示例:

需用到内置变量:NR 表示记录数,在执行过程中对应于当前的行号。

需用到内置变量:NF 表示字段数,在执行过程中对应于当前的字段数。而$NF则表示一行中的最后一个字段。

需用到内置变量:$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">$ echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}'</code>
登录后复制

将外部变量值传递给awk

需用到-v选项,可以将外部值(并非来自stdin)传递给awk,有三种方式。

第一种:写在脚本内(脚本后缀名随意,编辑好直接运行即可)

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">var1="aaa" var2="bbb" echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2</code>
登录后复制

第二种:传递外部变量方法:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">Va=100 echo | awk -v  VARIABLE=$Va '{ print VARIABLE }'</code>
登录后复制

第三种:当输入来自于文件时使用??

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename</code>
登录后复制

以上就是Linux系统开发: 学习linux三剑客(awk、sed、grep)(下)的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号