awk '{print $1,$4}' test.txt 查看第一列和第四列
awk '{printf "%-8s %-10s %-20s %-15s\n",$1,$3,$5,$6}' test 查看1 3 5 6 列 并打印出间距格式(格式化输出)
过滤记录:awk '$3==0 && $6=="LISTEN"' test
选出第3列值为0并且第6列值为"LISTEN"
awk '$3>0 {print $0}' test 第3列值大于0的,$0---整行
awk '$3==0 && $6=="LISTEN" || NR==1' test NR表头==1 第一行
'$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' test 加格式化输出
说到了内建变量,我们可以来看看awk的一些内建变量:
$0当前记录(这个变量中存放着整个行的内容)
$1~$n当前记录的第n个字段,字段间由FS分隔
FS输入字段分隔符 默认是空格或Tab
NF当前记录中的字段个数,就是有多少列
NR已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS输入的记录分隔符, 默认为换行符
OFS输出字段分隔符, 默认也是空格
ORS输出的记录分隔符,默认为换行符
FILENAME当前输入文件的名字
指定分隔符: awk 'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd =root 0 /root
bin 1 /bin
daemon 2 /sbin
adm 3 /var/adm
lp 4 /var/spool/lpd
sync 5 /sbin
root 0 /root
bin 1 /bin
daemon 2 /sbin
adm 3 /var/adm
lp 4 /var/spool/lpd
sync 5 /sbin
shutdown 6 /sbin
halt 7 /sbin
awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
root 0 /root
bin 1 /bin
daemon 2 /sbin
adm 3 /var/adm
lp 4 /var/spool/lpd
sync 5 /sbin
awk -F '[;:]' 如果你要指定多个分隔符,你可以这样来:
awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
第6列中带有“FIN”的列,加首列原本行号,排列格式
awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
上面的第一个示例匹配FIN状态, 第二个示例匹配WAIT字样的状态。其实 ~ 表示模式开始。/ /中是模式。这就是一个正则表达式的匹配。
我们可以使用 “/FIN|TIME/” 来匹配 FIN 或者 TIME :
awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
再来看看模式取反的例子: awk '$6 !~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt