9.6/9.7 awk
9.6/9.7 awk
awk相比sed 支持分段,可以支持每个段进行匹配。
创建一个awk目录,拷贝passwd做实验
打印第一段 awk -F ':' '{print $1}' test.txt(-F指定分隔符)
打印多段 awk -F ':' '{print $1,$2,$3}' test.txt
打印所有段awk '{print $0}' test.txt(无需用-F指定分隔符,默认以空格为分隔符)
指定以"#"为分隔符..{print $1"#"$2"#"$3}...
awk的匹配功能:
awk '/oo/' test.txt
如果只要第一段awk -F ':' '$1 ~ /oo/' test.txt
这就是比grep sed强大的地方,可以分段去匹配同样也支持正则表达式,并且不需要加脱译字符
支持多个表达式一起写awk -F ':' '/root/ {print $1,$3} /user/ {print $3,$4} ' test.txt //打印含root的13段和user34段
匹配所有包含root或user的:awk -F ':' '/root|user/ {print $0} ' test.txt
针对数学表达式的 awk -F ':' '$3==0 {print $1}' test.txt(不写print默认0)
awk -F ':' '$7!="/sbin/nologin" {print $1}' test.txt //!=不等于,字符串要加双引号。
两个字段相对去比较 awk -F ':' '$3>$4' test.txt
awk -F ':' '$3==$4' test.txt
awk -F ':' '$3>5 && $3<7 ' test.txt //大于5小于7 ,&&并且
awk -F ':' '$3>1000 | $7=="/sbin/nologin" ' test.txt // |或者
awk -F ':' '$3>1000 | $7 ~ bash' test.txt // ~ 匹配
前面有过怎么更改分隔符,但是如果数量多的话就无法操作,现在有个更加方便的指令
awk -F ':' ' {OFS="#"} {print $1,$2,$3}' test.txt // OFS为系统内置变量,指定输出分隔符
增加条件:
if 判断。
NR表示行,NF表示段
awk -F ':' '{print NR ":"$0}' test.txt //打印所有行
awk -F ':' '{print NF ":"$0}' test.txt //打印所有段
NR可以作为一个判断条件。
比如打印前十行
awk -F ':' 'NR<=10' test.txt
可以多个条件一起用
awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt
同样可以针对NF作为一个判断条件。
可以赋值,$1=root
头三行的开头都会变成root
tot循环函数,一开始为0 ,一直累加 含义就是累加每一行第三段的值,求和第三段