码迷,mamicode.com
首页 > 其他好文 > 详细

2.6-awk命令

时间:2015-07-27 16:36:14      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:2.6-awk命令

awk命令         实现分段,对分段进行过滤,替换等操作,还可进行逻辑判断和数字运算。
                     比grep、sed、功能更多,更加强大。

分段打印:

awk -F ‘:‘ ‘{print $3,$4}‘ 1.txt              以:分割,打印第3段和第4段   -F指定分隔符

awk -F ‘:‘ ‘OFS="#" {print $3,$4}‘ 1.txt      以:分割,打印第3段和第4段,分段之间用指定的#号分割

匹配打印:  //

awk ‘/user/‘ 1.txt                            文本中匹配user的行

awk ‘/user|root/‘ 1.txt                       或者关系

awk ‘/(oo)+/‘ 1.txt                           匹配1-无穷个oo整体

awk ‘/r+o/‘ 1.txt                             匹配ro rro rrr...o的行

注意:? + () |特殊字符,awk均支持,不必加上转义符\  只有{}除外!

      在grep、sed中均支持{},但awk属于复杂的流脚本处理语言,{}在它里面有特殊的含义。

      但是用转义符\无效,只有一个方法:命令前面加上参数--posix 就OK了

      

分段匹配:  $N~//

awk -F ‘:‘ ‘$1~/r*o/‘ 1.txt                   以:为分割,第一段匹配o ro rro rrr...o的行

awk -F ‘:‘ ‘$1~/r*o/ {print $3}‘ 1.txt        1列匹配关键字,然后打印3列的内容(精准匹配,精准打印)

awk -F ‘:‘ ‘$1~/r*o/ {print $3};$1~/ro+/ {print $3}‘ 1.txt  两条过滤规则,两次执行,一条命令

awk -F ‘:‘ ‘$1~/root|user/ {print $3}‘ 1.txt  一条过滤规则,一次执行 (或者关系,都包含,打印一次)

awk --posix -F ‘:‘ ‘$1~/(ro)+|w{1,3}/ {print $1,$3}‘ 2.txt   使用{1,3}符号,必须加上--posix

条件操作符:   ==等于  >=大于等于   <=小于等于    !=不等于     !~不匹配

awk -F‘:‘ ‘$3=="root"‘ 2.txt                   第三段是root的打印出来 注意:=为赋值 ==为等于判断

awk -F‘:‘ ‘$3=="root||$7~/nologin/"‘ 2.txt     第3段是root或者第7段匹配nologin的行打印(或者关系)

awk -F‘:‘ ‘$3>=500‘ 2.txt                      第3段数值大于等于500的行,打印出来

awk -F‘:‘ ‘$3>="500"‘ 2.txt                    "500"是按ASSIC码500比较,而不是数值500

awk -F‘:‘ ‘$7!="/sbin/nologin"‘ 2.txt          7段不等于关键字的行,注意/需要加上"" 否则不对

awk -F‘:‘ ‘$7!=/nologin/‘ 2.txt                !~为不匹配,效果同上。注意关键字没有/和有/的区别

awk -F‘:‘ ‘$3>$4‘ 2.txt                        3列大于4列的行

awk -F‘:‘ ‘OFS=":" {if($3>100){$7=$3+$4;print $0}}‘ 2.txt   (匹配一次,打印一次)            

如果3列大于100,7列=3列+4列,然后打印整行。OFS在{}外,没有print命令,则不打印结果。注意写法

awk -F‘:‘ ‘BEGIN {OFS=":"}{if($3>100){$7=$3+$4}} END {print $0}‘ 2.txt (匹配完毕后,打印最后结果)

只输出那个最后一行,END通常用在循环的时候,最后输出一个结果

内置变量:  NR行数  $NR1~N段(必不同)     NF分段数   $NF具体每行分段数的段(可相同可不同)

awk -F‘:‘ ‘NR<10‘ 2.txt                        打印行号大于10的行

awk -F‘:‘ ‘NR==10 {print $3,$4}‘ 2.txt         打印10行的3段和段

awk -F‘:‘ ‘{if(NR==10) {print $3,$4}}‘ 2.txt   如果行号等于10,打印3段和4段 (看起来和上面效果一样)

注意:如果文本某个字段发生了改变,原有的分隔符会被空格替换,所以可以用OFS来指定新的分隔符。如下:

awk -F‘:‘ ‘OFS=":"{if(NR==10) {print $3,$4}}‘ 2.txt   显示结果同上,只是分隔符变为指定的:

如果要使用OFS,后面必须使用{},这是固定语法。否则提示出错。

awk -F‘:‘ ‘{if(NF==5) print $1}‘ 2.txt         如果行有5段,则打印第1段

awk -F‘:‘ ‘{print $NR,$NF}‘ 2.txt              打印函数$NR段和函数$NF段

awk -F‘:‘ ‘{print NR,$NF}‘ 2.txt               打印行数和函数段

awk -F‘:‘ ‘{print NR,NF}‘ 2.txt                打印行数和段数

awk -F‘:‘ ‘{print $NR,NF}‘ 2.txt               打印函数段和段数

数值运算:

awk -F‘:‘ ‘$7=$3+$4‘ 2.txt                                     7段的值改为3段+4段,并打印。文档改变,分隔符默认为空格 
awk -F‘:‘ ‘OFS=":" {$7=$3+$4;print $0}‘ 2.txt        7段的值改为3段+4段,并打印。分隔符为:

循环:

awk -F‘:‘ ‘{(sum=sum+$3)}; END {print sum}‘ 2.txt   打印第3段的总和


2.6-awk命令

标签:2.6-awk命令

原文地址:http://llzdwyp.blog.51cto.com/6140981/1678745

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!