Linux – AWK 桃扇骨 2022-06-01 13:13 136阅读 0赞 AWK命令可以用来格式化报文或从一个大的文本文件中抽取数据包,它在文本浏览和数据的熟练使用上性能优异。 **调用awk** 有三种方式调用awk。 第一种是命令行方式:awk \[-F field-separator\] ‘commands’ input-file(s) 第二种方法是将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。 第三种方式是将所有的awk命令插入一个单独文件,然后调用:awk –f awk-script-file input-files(s) -f 选项指明在文件awk\_script\_file中的awk脚本,input\_files(s)是使用awk进行浏览的文件名。 **awk脚本** 在命令中调用awk时,awk脚本由各种操作和模式组成。 如果设置了-F选项,则awk每次读一条记录或一行,并使用指定的分隔符分隔指定域,但如果未设置-F选项,awk假定空格为域分隔符,并保持这一个设置直到发现一新行。当新行出现时,awk命令获悉已读完整条记录,然后在下一个记录启动读命令,这个读进程将持续到文件尾或文件不再存在。 如下图,awk每次在文件中读一行,找到域分隔符(这里是符号\#),设置其为域n,直到以个新行(缺省记录分隔符),然后,划分这一行作为一条记录,接着,再次启动下一行读进程。 ![20180130151312640][] 任何awk语句都由模式和动作组成。在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。 模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段BEGIN和END。使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式,awk总是匹配或打印行数。 实际动作在大括号\{\}内指明。动作大多数用来打印,但还有更长的代码比如if或循环,如果不指明采取动作,awk将打印出所有浏览出来的记录。 awk执行时,其浏览域标记为$1, $2……$n。这种方法称为域标识。当然,如果我们希望将所有域都打印出来,不必指明$1,$2….$n,可直接使用$0. 为打印一个域或所有域,使用print命令。awk ‘\{print $0\}’ file.txt > xxx.file 在awk中可以使用正则表达式,这里正则表达式用斜线括起来,比如我们需要查询Green,使用/Green/可以查出单词Green的出现情况。 awk中正则表达式匹配操作,可以使用元字符: ![20180130151349575][] 同样,也支持条件操作符: ![20180130151415500][] 复合操作符,可以用来行程复杂的逻辑操作: ![20180130151436712][] awk有许多内置变量,可以用来设置环境信息: ![20180130151457626][] awk中可以使用操作符,基本表达式可以划分为数字型,字符串型,变量型,域及数组元素。 ![20180130151526660][] awk中,可以对域名进行设置,将域名设置为有意义的,在进行模式匹配或者关系操作时更容易理解。例如name=$n。 域值比较:$6<27 修改数值域取值,实际输入文件时不可修改的,修改的只是保存在缓存里的awk复本。$1=$1+5 只显示修改记录,如果文件很大,记录超过100,打印所有记录只为查看修改部分显然不合情理。在模式后面使用花括号只打印修改部分:awk ‘\{if($1==”J.Torll”) \{$1=”J.L.Troll”; print $1\}\}’ grade.txt。 创建新的输出域,在处理数据时,基于各域进行计算时创建新域是一种好习惯。比如,假定记录包含3个域,创建一个基于其他域的加法新域\{$4=$2+$3\}。 增加列值,增加列数或进行运行结果统计,使用符号+=。例如将$1加入变量total:total+=$1 文件长度相加,在目录中查看文件时,如果想快速查看所有文件的长度及其总和,但要排除子目录,可以用ls –l,然后管道输出到awk,排除首字符为d的记录,然后将文件长度列相加:ls –l | awk ‘ /^\[^d\] / \{print $9”\\t”$5\} \{tot+=$5\} END \{print “totalKB:”tot\}’ awk有很多强大的字符串函数: ![20180130151730003][] 使用字符串或正则表达式时,有时需要在输出中加入一新行或其他的: ![20180130151556310][] awk提供函数printf,拥有不同的格式化输出功能,比如按列输出,左对齐或右对齐。 ![20180130151650414][] 使用awq来编写小脚本是一个不太难的事,但是能给我们带来强大的文本处理能力。 [20180130151312640]: /images/20220601/573df4cc9f0649cdae3b28d210a9983f.png [20180130151349575]: /images/20220601/111485ca7ad54c199217b10d237d70a1.png [20180130151415500]: /images/20220601/399d1f616730407da486036f6c0a00ae.png [20180130151436712]: /images/20220601/654e10ef591d4f27807909a366162023.png [20180130151457626]: /images/20220601/78ef812012bc41b889a5cc5e9c6a9bf1.png [20180130151526660]: /images/20220601/7e302b9881de44a98be8834ff953a851.png [20180130151730003]: /images/20220601/a8d11dcbaa3f4a73824aae9a67ab4cbc.png [20180130151556310]: /images/20220601/ba2290eefd274754be735431f4d11e4e.png [20180130151650414]: /images/20220601/c7f97fcd6b4c49a18847d4d8bc37ef9a.png
还没有评论,来说两句吧...