上面也提到了awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行
一行的去执行。awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到
的。awk工具其实是很复杂的,有专门的书籍来介绍它的应用,但是笔者认为学那么复杂没
有必要,只要能处理日常管理工作中的问题即可。何必让自己的脑袋装那么东西来为难自
己?毕竟用的也不多,即使现在教会了你很多,你也学会了,如果很久不用肯定就忘记了。
鉴于此,笔者仅介绍比较常见的awk应用,如果你感兴趣的话,再去深入研究吧。
a.截取文档中的某个段
解释一下,-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符。
Print为打印的动作,用来打印出某个字段。$1为第一个字段,$2为第二个字段,依次类推,
有一个特殊的那就是$0,它表示整行。
注意awk的格式,-F后紧跟单引号,然后里面为分隔符,print的动作要用’{}’括起来,否则
会报错。print还可以打印自定义的内容,但是自定义的内容要用双引号括起来。
b.匹配字符或字符串
跟sed很类似吧,不过还有比sed更强大的匹配。
可以让某个段去匹配,这里的’~’就是匹配的意思,继续往下看
awk还可以多次匹配,如上例中匹配完root,再匹配test,它还可以只打印所匹配的段。
不过这样没有啥意义,笔者只是为了说明awk确实比sed强大。
d.条件操作符
awk中是可以用逻辑符号判断的,比如’==’就是等于,也可以理解为“精确匹配”。另外也有’>’,
‘>=’,‘<’,‘<=’,‘!=’ 等等,值得注意的是,即使$3为数字,awk也不会把它当数字看待,它会
认为是一个字符。所以不要妄图去拿$3当数字去和数字做比较。
这样是得不到我们想要的效果的。这里只是字符与字符之间的比较,’6’是>’500’的。
上例中用的是’!=’ 即不匹配。
另外还可以使用”&&” 和“||”表示“并且”和“或者”的意思。
也可以是或者的关系
d.awk的内置变量
常用的变量有:
NF:用分隔符分隔后一共有多少段;
NR:行数
上例中,打印总共的段数以及最后一段的值。
可以使用NR作为条件,来打印出指定的行。
e.awk中的数学运算
awk比较强的地方,还在于能把某个段改成指定的字符串,下面还有更强的呢!
当然还可以计算某个段的总和。
这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同
sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都
是可以的,只是笔者认为日常管理工作中没有必要使用那么复杂的语句而已。
这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同
sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都
是可以的,只是笔者认为日常管理工作中没有必要使用那么复杂的语句而已。
注意这里’()’的使用。
基本上,正则表达的内容就这些了。但是笔者要提醒你一下,笔者介绍的这些仅仅是最
基本的东西,并没有提啊深入的去讲sed和awk,但是完全可以满足日常工作的需要,有时
候也许你会碰到比较复杂的需求,如果真遇到了就去请教一下google吧。下面出几道关于
awk的练习题,希望你要认真完成。
1.用awk打印整个test.txt (以下操作都是用awk工具实现,针对test.txt);
2.查找所有包含’bash’的行;
3.用’:’作为分隔符,查找第三段等于0的行;
4.用’:’作为分隔符,查找第一段为’root’的行,并把该段的’root’换成’toor’(可以连同sed一起
使用);
5.用’:’作为分隔符,打印最后一段;
6.打印行数大于20的所有行;
7.用’:’作为分隔符,打印所有第三段小于第四段的行;
8.用’:’作为分隔符,打印第一段以及最后一段,并且中间用’@’连接(例如,第一行应该是
这样的形式“root@/bin/bash”;
9.用’:’作为分隔符,把整个文档的第四段相加,求和;
下面给出答案:
1.awk'{print $0}'test.txt
2.awk'/bash/'test.txt
3.awk-F':''$3=="0"' test.txt
4.awk-F':''$1=="root"'test.txt|sed's/root/toor/'
5.awk-F':''{print $NF}'test.txt
6.awk-F':''NR>20' test.txt
7.awk-F':''$3<$4' test.txt
8.awk-F':''{print $1"@"$NF}'test.txt
9.awk-F':''{(sum+=$4)};END{printsum}'test.txt