上面也提到了awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行
一行的去执行。awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到
的。awk工具其实是很复杂的,有专门的书籍来介绍它的应用,但是笔者认为学那么复杂没
有必要,只要能处理日常管理工作中的问题即可。何必让自己的脑袋装那么东西来为难自
己?毕竟用的也不多,即使现在教会了你很多,你也学会了,如果很久不用肯定就忘记了。
鉴于此,笔者仅介绍比较常见的awk应用,如果你感兴趣的话,再去深入研究吧。
a.截取文档中的某个段

【awk工具的使用】

解释一下,-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符。

【awk工具的使用】

Print为打印的动作,用来打印出某个字段。$1为第一个字段,$2为第二个字段,依次类推,
有一个特殊的那就是$0,它表示整行。

【awk工具的使用】

注意awk的格式,-F后紧跟单引号,然后里面为分隔符,print的动作要用’{}’括起来,否则
会报错。print还可以打印自定义的内容,但是自定义的内容要用双引号括起来。

【awk工具的使用】

b.匹配字符或字符串

【awk工具的使用】

跟sed很类似吧,不过还有比sed更强大的匹配。

【awk工具的使用】

可以让某个段去匹配,这里的’~’就是匹配的意思,继续往下看

【awk工具的使用】

awk还可以多次匹配,如上例中匹配完root,再匹配test,它还可以只打印所匹配的段。

【awk工具的使用】

不过这样没有啥意义,笔者只是为了说明awk确实比sed强大。

 

d.条件操作符

【awk工具的使用】

awk中是可以用逻辑符号判断的,比如’==’就是等于,也可以理解为“精确匹配”。另外也有’>’,
‘>=’,‘<’,‘<=’,‘!=’ 等等,值得注意的是,即使$3为数字,awk也不会把它当数字看待,它会
认为是一个字符。所以不要妄图去拿$3当数字去和数字做比较。

【awk工具的使用】

这样是得不到我们想要的效果的。这里只是字符与字符之间的比较,’6’是>’500’的。

【awk工具的使用】

上例中用的是’!=’ 即不匹配。

【awk工具的使用】

另外还可以使用”&&” 和“||”表示“并且”和“或者”的意思。

【awk工具的使用】

也可以是或者的关系

【awk工具的使用】

d.awk的内置变量
常用的变量有:
NF:用分隔符分隔后一共有多少段;
NR:行数

【awk工具的使用】

上例中,打印总共的段数以及最后一段的值。

【awk工具的使用】

可以使用NR作为条件,来打印出指定的行。

【awk工具的使用】

e.awk中的数学运算

【awk工具的使用】

awk比较强的地方,还在于能把某个段改成指定的字符串,下面还有更强的呢!

【awk工具的使用】

当然还可以计算某个段的总和。

【awk工具的使用】

这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同
sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都
是可以的,只是笔者认为日常管理工作中没有必要使用那么复杂的语句而已。

【awk工具的使用】

这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同
sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都
是可以的,只是笔者认为日常管理工作中没有必要使用那么复杂的语句而已。

【awk工具的使用】

注意这里’()’的使用。
基本上,正则表达的内容就这些了。但是笔者要提醒你一下,笔者介绍的这些仅仅是最
基本的东西,并没有提啊深入的去讲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.用’:’作为分隔符,打印第一段以及最后一段,并且中间用’@’连接(例如,第一行应该是
这样的形式“[email protected]/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

转载于:https://my.oschina.net/jiaozg/blog/93656

相关文章:

  • 2021-05-08
  • 2022-01-17
  • 2021-11-03
  • 2022-01-27
  • 2022-12-23
  • 2021-11-06
  • 2021-05-28
  • 2021-09-02
猜你喜欢
  • 2022-01-08
  • 2021-07-13
  • 2021-07-20
  • 2022-01-13
  • 2022-12-23
  • 2021-06-29
  • 2021-06-10
相关资源
相似解决方案