9.6/9.7 awk
awk和sed是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行。awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的。
- 截取文档中的某个段
解释一下,-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符。 Print为打印的动作,用来打印出某个字段。$1为第一个字段,$2为第二个字段,依次类推,有一个特殊的那就是$0,它表示整行。
注意awk的格式,-F后紧跟单引号,然后里面为分隔符,print的动作要用 { } 括起来,否则会报错。print还可以打印自定义的内容,但是自定义的内容要用双引号括起来。
- 匹配字符或字符串
跟sed很类似,不过还有比sed更强大的匹配。
可以让某个段去匹配,这里的’~’就是匹配的意思。
awk还可以多次匹配,如上例中匹配完root,再匹配test,它还可以只打印所匹配的段。
- 条件操作符
[root@localhost ~]# awk -F ':' '$3=="0"' /etc/passwd
awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,也可以理解为 ‘精确匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得注意的是,即使$3为数字,awk也不会把它当数字看待,它会认为是一个字符。所以不要妄图去拿$3当数字去和数字做比较。
在上面的例子中,本想把pid大于等于500的行打印出,但是结果并不是我们的预期,这是因为awk把所有的数字当作字符来对待了,就跟上一章中提到的 sort 排序原理一样。
!= 为不匹配,除了针对某一个段的字符进行逻辑比较外,还可以两个段之间进行逻辑比较。
awk -F ':' '$3<$4' /etc/passwd
另外还可以使用 && 和 || 表示 “并且” 和 “或者” 的意思。
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
也可以是或者
awk -F ':' '$3>"5" || $7=="/bin/bash"' /etc/passwd
- awk的内置变量
awk常用的变量有:
NF :用分隔符分隔后一共有多少段
NR :行数
NF 是多少段,而$NF是最后一段的值, 而NR则是行号。
我们可以使用行号作为判断条件:
awk 'NR>20' /etc/passwd
也可以配合段匹配一起使用:
awk -F ':' 'NR>20 && $1 ~ /ssh/' /etc/passwd
- awk中的数学运算
还可以计算某个段的总和
awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都是可以的,不过日常管理工作中没有必要使用那么复杂的语句。
awk -F ':' '{if ($1=="root") print $0}' /etc/passwd