awk工具的使用

上面也提到了awksed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行。awksed更加强大,它能做到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循环都是可以的,只是笔者认为日常管理工作中没有必要使用那么复杂的语句而已



注意这里’( )’的使用

基本上,正则表达的内容就这些了但是笔者要提醒你一下,笔者介绍的这些仅仅是最基本的东西,并没有提啊深入的去讲sedawk,但是完全可以满足日常工作的需要,有时候也许你会碰到比较复杂的需求,如果真遇到了就去请教一下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 {print sum}' test.txt

添加新评论 »