awk
原理图
awk提供一个类似于编程的开放环境,让你能够自定义文本处理的规则,修改和重新组织文件中的内容。awk在流编辑法方面比sed更为先进的是:它提供一种编程语言而不是一组文本编辑的命令,在编程语言的内部,可以定义保存数据的变量,使用算术和字符串操作函数对数据进行运算,支持结构化编程概念,能够使用if和循环语句等。
awk [option] 'pattern { action }' file
option为命令的选项,pattern为行匹配规则,action为执行的具体操作:如果没有pattern,则对所有行执行action,而如果action,则打印所有匹配的行,file为输入的文件。eg:
awk 'BEGIN {FS=":";print "---header---"} /mysql/ {print $1} END {print "---footer---"}' /etc/passwd
内建变量
内建变量
变量名 | 含义 |
---|---|
$1 | 当前记录的第一个字段,字段间有FS分隔,$2~$n类似 |
$0 | 当前记录(这个变量存放着整个行的内容) |
NF | 当前记录中的字段个数,就是有多少列,输出最后一列 |
NR | 已读出的记录数,就是行号,从1开始,如果有多个文件的话,这个值也是不断累加 |
FNR | 已读出的记录数,与NR不同,这个值会是各个文件自己的行号 |
FS | 输入字段分隔符,默认是空白符 |
RS | 输入的记录分隔数,默认为换行符 |
OFS | 输出字段分隔符,默认空格 |
ORS | 输出的记录分隔符,默认换行 |
FILENAME | 当前输入文件的名字 |
length($0) | 当前行的长度 |
例子
1.打印第1,4列,其中$0是所有列
awk '{print $1,$4}' netstat.txt
2.格式化输出,跟c的格式化一样(除没有逗号了)%-8s:左对齐八个字节,不足空格补齐
awk '{printf "%-8s %-8s %-8s %-22s %-15s\n",$1,$2,$3,$4,$5}' netstat.txt
3.条件打印 比较运算符 ==,!=,>,<,>=,<= 或与 &&,||
awk '$2==0 && $6=="TIME_WAIT"' netstat.txt
4.输出 第三列值为0 且第六列值为ESTABLISHED或者第一行,打印总行号,行号,第四列,第五列,第六列
awk '$3==0 && $6=="ESTABLISHED" || NR==1 {printf "%02s %s %-20s %-20s %s\n",NR,FNR,$4,$5,$6}' netstat.txt
5.输出第三列值大于0 ,打印所有列
awk '$3> 0 {print $0}' netstat.txt
6.模式匹配 匹配第六列包含WAIT的行或者第一行,打印行号,第四列,第五列,第六列,并以制表符为分隔符
awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
7.模式匹配,匹配第六列包含FIN或则会TIME的行….
awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6} OFS="\t" netstat.txt
8.第六列不包含WAIT的行
awk '$6 !~ /WAIT/ || NR== 1{print NR,$4,$5,$' OFS="\t" netstat.txt
9.不包含WAIT的行
awk '!/WAIT/' netstat.txt
10.指定分隔符为:
awk 'BEGIN{FS=":"}{print $1,$3,$6}' /etc/passwd
awk -F : '{print $1,$3,$6}' /etc/passwd
11.指定分隔符为;或者:
awk -F '[;:]' '{print $1,$3,$6}' /etc/passwd
12.不输出第一列,格式化输出到文件中,以第六列命名
awk 'NR!=1 {print > $6}' netstat.txt
13.相加某列
awk '$3==12 {sum += $4;month=$3} END {print month,sum/30}' ticket_count
awk 'NR < 9 {sum += $0} END {print sum}}
14.去重
awk '{if (!seen[$0]++) { print $0; } }' netstat.txt
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
-f 选项来指定包含文本处理程序的脚本文件
15.打印最后一列
awk '{print $NF}' file
- 上一篇 tcp 有限状态机(译)
- 下一篇 tr