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 ,一直累加 含义就是累加每一行第三段的值,求和第三段