awk工具的使用

awk也是流式编辑器,针对文档中的行来操作,一行 一行的执行。

截取文档中的某个段:

head -n2 test.txt | awk -F ' : ' '{print $1}' 本例中,-F 选项的作用是指定分隔符。print为打印的动作,用来打印某个字段, $1为第一个字段,$2为第二个字段,以此类推。$0表示整行。 head -n2 test.txt |awk -F ' : ' ' print $0}' 注意awk的格式,-F后面紧跟单引号,单引号里面是分隔符。print的动作要用{}括起来。否则会报错。print还可以打印自定义内容,但自定义的内容要用双引号括起来,如下所示: head -n2 test.txt | awk -F ' : ' '{print $1 "#" $2 "#" $3 "#" $4}'

匹配字符或者字符串

awk '/oo/' test.txt

awk -F ' : ' '$1 ~/oo/' test.txt

awk -F ' : ' ' /root/ {print $1,$3} /test/ {print $1,$3}' test.txt

条件操作符

awk -F ' : ' '$3=="o" ' /etc/passwd #不加双引号则会认为是数字

awk -F ' : ' '$3>=500' /etc/passwd #把uid大于等于500的行打印出来

awk -F ' : ' '$3<$4' /etc/passwd #两个字段之间进行逻辑比较

awk -F ' : ' '$>"5" && $3<"7" /etc/passwd

awk -F ' : ' ' $>1000 || $3=="/bin/bash" ' /etc/passwd

awk的内置变量

awk常用变量有OFS、NF和NR,OFS和-F选项有类似的功能,也是用来定义分隔符的,但是它是在输出的时候定义,NF表示用分隔符分隔后一共有多少段,NR表示行号。 head -5 /etc/passwd | awk -F ' : ' '{OFS="#"} {print $1,$3,$4}'

awk -F ' : ' '{OFS="#“}{if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd

head -n3 /etc/passwd | awk -F ' : ' '{print NF}'

head -n3 /etc/passwd | awk -F ' : ' '{print $NF}'

head -n3 /etc/passwd | awk -F ' : ' '{print NR}'

awk 'NR>40' /etc/passwd

awk -F ' : ' 'NR<20 && $1 ~ /roo/' /etc/passwd

awk中的数学运算

head -n 3 /etc/passwd | awk -F ' : ' '$1="root" '

head -n2 /etc/passwd

awk -F ' : ' '{(tot=tot+$3)}; END {print $0}}' /etc/passwd