【linux学习笔记】awk用法总结

来源:互联网 发布:java ocr 验证码 编辑:程序博客网 时间:2024/06/06 00:57

AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一.

这篇博客是http://coolshell.cn/articles/9070.html的读书笔记。

---


//
//按列输出
//

首先,用

netstat > netstat.txt

命令把netstat的结果重定向到netstat.txt中
结果类似这样:
Proto Recv-Q Send-Q Local Address           Foreign Address         Statetcp        0      0 localhost:37745         localhost:4730          ESTABLISHEDtcp        0      0 localhost:48344         localhost:4730          ESTABLISHEDtcp        0      0 localhost:4730          localhost:48344         ESTABLISHEDtcp        0      0 localhost:48342         localhost:4730          ESTABLISHEDtcp        0     52 ip-10-156-238-114.a:ssh li476-220.members:49359 ESTABLISHEDtcp        0      0 localhost:4730          localhost:37741         ESTABLISHEDtcp        0      0 localhost:48340         localhost:4730          ESTABLISHEDtcp        0      0 localhost:48341         localhost:4730          ESTABLISHEDtcp        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:37745tcp localhost:48344tcp localhost:4730tcp localhost:48342tcp ip-10-156-238-114.a:sshtcp localhost:4730tcp localhost:48340tcp localhost:48341tcp ip-10-156-238-114.:http


//
//过滤记录
//

下面过滤条件为:第三列的值为0 && 第6列的值为ESTABLISHED
awk '$3==0 && $6=="ESTABLISHED"' netstat.txt

结果:
tcp        0      0 localhost:37745         localhost:4730          ESTABLISHEDtcp        0      0 localhost:48344         localhost:4730          ESTABLISHEDtcp        0      0 localhost:4730          localhost:48344         ESTABLISHEDtcp        0      0 localhost:48342         localhost:4730          ESTABLISHEDtcp        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       ESTABLISHED10 localhost:48341      localhost:4730       ESTABLISHED12 localhost:4730       localhost:37747      ESTABLISHED


//
//指定分隔符
//

awk 'BEGIN{FS=":"} {print $1, $3, $6}' /etc/passwd

说明:
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }

结果:

root 0 /rootbin 1 /bindaemon 2 /sbinadm 3 /var/admlp 4 /var/spool/lpdsync 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  ESTABLISHED4       localhost:48344 localhost:4730  ESTABLISHED5       localhost:4730  localhost:48344 ESTABLISHED6       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"}'




0 0
原创粉丝点击