9.6/9.7 awk
awk工具
awk支持分段匹配
awk指定分割符并打印出来:awk -F ':' '{print $1}' xxx.txt
awk 指定分隔符把所有内容打印出: awk -F ':'{print $0}' xxx.txt 或者直接 awk '{print $0}' xxx.txt
如果不指定分隔符,默认以空白或者空格作为分隔符,测试结果如下:
打印多段内容时,只需要在其中加上逗号
如果想在字符中间以指定符号作为分隔符,以#为例加“#”即可
awk实现查找无需加多余字符,以/oo/为例 awk '/oo/' xxx.txt
同样支持正则表达式,且分段式搜索如: awk -F ':' '$1 ~/o+/' xxx.txt; awk -F ':' '$1 ~/oo+/' xxx.txt
awk可执行多个操作(以root/user, test.txt为例): awk -F ':' '/root/ {print $1,$2,$3} /user/ {print $1,$3,$4}' test.txt
使用egrep/grep -E查看含有root/user的行 egrep/grep -E 'root|user' test.txt
awk -F ':' '/root|user/ {print $0}' test.txt== grep -E 'root|user' test.txt 区别仅仅在颜色
awk命令同样可以结合数学运算,如==,>=,<=,!= (特别注意:以1000为例,加上双引号"",系统会认为是一个字符串,在对比查询中会以ASCII码表中的编码进行大小对比,如果对比对象是数字本身无需添加双引号,如果是字符串需要加之)
awk$各段对比
列出第三段大于1000或者第七段等于/sbin/nologin的行
~匹配符,即:第三段大于1000或者第七段中包含/bash/的
OFS为内置变量,输出生效为print后的分隔符,代替-F ':',具体语法为:
awk -F ':' '{OFS="xx"} 条件句 {print $xxxx}' xxx.txt
if语句
NR 行 NF段数和
awk -F '{print NR":"$0}' test.txt
awk -F '{print NF":"$0}' test.txt
NR, NF同样可以用于条件判断
'NR<=10': 列出行号小于等于10的行
'NR<=10 && $1 ~ /root|adm/' : 列出行号小于等于10且第一列中含有root或者adm的行
' {print $NR":"$NF}': 打印出所有行数字的列和段数列
赋值和等于的区别:顾名思义,前者是对某个指定变量进行赋值,后者是数学表达式中的相等
在awk中,如下图所示: $1=root把第一段都赋值给root;而等于号则是查找第一段等于root的行,OFS变量可以打印前先加上
awk求和
awk -F ':' '{(tot=total+$3)}; END {print tot}' filename