AWK简明教程

原文:http://coolshell.cn/articles/9070.html

 

note:

1.NR表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数,NR可以理解为Number of Record的缩写。

在awk处理多个输入文件的时候,在处理完第一个文件后,NR并不会从1开始,而是继续累加,因此就出现了FNR,每当处理一个新文件的时候,FNR就从1开始计数,FNR可以理解为File Number of Record。另外NR还可以表示取第几行,如取第二行,用法如下:

df / -k | awk ‘{print $4}’|awk ‘NR==2′

2.awk'$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}'OFS="\t"netstat.txt

\\之间的表示字符串匹配,根据字符串的内容来过滤相应的记录

3.下面的命令计算所有的C文件,CPP文件和H文件的文件大小总和。

ls-l  *.cpp *.c *.h | awk'{sum+=$5} END {print sum}'

4.对于awk ‘!a[$3]++’,需要了解3个知识点
a、awk数组知识,不说了
b、awk的基本命令格式 awk ‘pattern{action}’
    省略action时,默认action是{print},如awk ‘1’就是awk ‘1{print}’
b、var++的形式:先读取var变量值,再对var值+1

以数据
1 2 3
1 2 3
1 2 4
1 2 5
为例,对于awk ‘!a[$3]++’
awk处理第一行时: 先读取a[$3]值再自增,a[$3]即a[3]值为空(0),即为awk ‘!0’,即为awk ‘1’,即为awk ‘1{print}’
awk处理第二行时: 先读取a[$3]值再自增,a[$3]即a[3]值为1,即为awk ‘!1’,即为awk ‘0’,即为awk ‘0{print}’

5.apache日志中得到访问量最高前100个IP

cat access.log | awk ‘{a[$1]++} END {for(b in a) print b”\t”a[b]}’|sort -k2 -nr|head  -100

ps:另一种方法:awk ‘{print $1}’ access.log |sort|uniq -c |sort -n|tail -100

参考:http://sebug.net/paper/books/awk/

     http://xuqq999.blog.51cto.com/3357083/774714

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>