AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一.
这篇博客是http://coolshell.cn/articles/9070.html的读书笔记。
---
//
//按列输出
//
首先,用
netstat > netstat.txt
命令把netstat的结果重定向到netstat.txt中
结果类似这样:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:37745 localhost:4730 ESTABLISHED
tcp 0 0 localhost:48344 localhost:4730 ESTABLISHED
tcp 0 0 localhost:4730 localhost:48344 ESTABLISHED
tcp 0 0 localhost:48342 localhost:4730 ESTABLISHED
tcp 0 52 ip-10-156-238-114.a:ssh li476-220.members:49359 ESTABLISHED
tcp 0 0 localhost:4730 localhost:37741 ESTABLISHED
tcp 0 0 localhost:48340 localhost:4730 ESTABLISHED
tcp 0 0 localhost:48341 localhost:4730 ESTABLISHED
tcp 0 1 ip-10-156-238-114.:http 60.175.244.116:5268 FIN_WAIT1
现在,我要打印第一列($1)和第四列($4),注意$0表示整行
awk '{print $1, $4}' netstat.txt
结果如下:
Proto Local
tcp localhost:37745
tcp localhost:48344
tcp localhost:4730
tcp localhost:48342
tcp ip-10-156-238-114.a:ssh
tcp localhost:4730
tcp localhost:48340
tcp localhost:48341
tcp ip-10-156-238-114.:http
//
//过滤记录
//
下面过滤条件为:第三列的值为0 && 第6列的值为ESTABLISHED
awk '$3==0 && $6=="ESTABLISHED"' netstat.txt
结果:
tcp 0 0 localhost:37745 localhost:4730 ESTABLISHED
tcp 0 0 localhost:48344 localhost:4730 ESTABLISHED
tcp 0 0 localhost:4730 localhost:48344 ESTABLISHED
tcp 0 0 localhost:48342 localhost:4730 ESTABLISHED
tcp 0 0 localhost:4730 localhost:37741 ESTABLISHED
//
//内建变量
//
$0 当前记录(这个变量中存放着整个行的内容)
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符 默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 输入的记录分隔符, 默认为换行符
OFS 输出字段分隔符, 默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字
输出行号的例子:
awk '$3==0 && $6=="ESTABLISHED" || NR==1 {printf "%2s %-20s %-20s %s\n", NR, $4, $5, $6}' netstat.txt
结果:
1 (w/o servers)
3 localhost:37745 localhost:4730 ESTABLISHED
4 localhost:48344 localhost:4730 ESTABLISHED
5 localhost:4730 localhost:48344 ESTABLISHED
6 localhost:48342 localhost:4730 ESTABLISHED
8 localhost:4730 localhost:37741 ESTABLISHED
9 localhost:48340 localhost:4730 ESTABLISHED
10 localhost:48341 localhost:4730 ESTABLISHED
12 localhost:4730 localhost:37747 ESTABLISHED
//
//指定分隔符
//
awk 'BEGIN{FS=":"} {print $1, $3, $6}' /etc/passwd
说明:
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
结果:
root 0 /root
bin 1 /bin
daemon 2 /sbin
adm 3 /var/adm
lp 4 /var/spool/lpd
sync 5 /sbin
上面的awk命令的另一种写法是:
awk -F: '{print $1, $3, $6}' /etc/passwd
//
//正则匹配
//
awk '$6 ~/EST/ || NR==1 {print NR, $4, $5, $6}' OFS="\t" netstat.txt
上面的命令中 $6 ~/EST/部分就是正则匹配。表示对第6列使用正则, ~ 表示模式开始。/ /中是模式。
1 (w/o servers)
3 localhost:37745 localhost:4730 ESTABLISHED
4 localhost:48344 localhost:4730 ESTABLISHED
5 localhost:4730 localhost:48344 ESTABLISHED
6 localhost:48342 localhost:4730 ESTABLISHED
//
//统计
//
列出当前目录下所有php文件的大小(即ls -l结果的第五列)
ls -l *.php | awk '{print $5}'
计算当前目录下所有php文件的大小总和
ls -l *.php | awk '{sum+=$5} END {print sum}'
统计各个connection状态(注意其中数组的用法)
awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' netstat.txt
统计每个用户的进程占用了多少内存
ps aux | awk 'NR!=1{a[$1]+=$6} END {for (i in a) print i ", " a[i] "KB"}'