Linux – AWK

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,直到以个新行(缺省记录分隔符),然后,划分这一行作为一条记录,接着,再次启动下一行读进程。

 

任何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中正则表达式匹配操作,可以使用元字符:

 

同样,也支持条件操作符:


复合操作符,可以用来行程复杂的逻辑操作:

 

 

awk有许多内置变量,可以用来设置环境信息:

 

awk中可以使用操作符,基本表达式可以划分为数字型,字符串型,变量型,域及数组元素。


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有很多强大的字符串函数:


 

使用字符串或正则表达式时,有时需要在输出中加入一新行或其他的:

 

awk提供函数printf,拥有不同的格式化输出功能,比如按列输出,左对齐或右对齐。

 

使用awq来编写小脚本是一个不太难的事,但是能给我们带来强大的文本处理能力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值