awk:报告生成器,根据输入信息,将输入信息格式化之后再显示出来
awk版本:
(1)awk
(2)new awk,简称nawk
(3)gnome awk,简称gwak
awk使用格式:
awk [options] ‘PATTERN { action }’ file1,file2…
options:
-F 指定分隔符
BEGIN{OFS=””} 指定输出分隔符
在options中使用的内置变量
(1)awk内置变量之记录变量:
FS:读取文本时所使用的字段分隔符,默认是空白字符
RS:读取文本时所使用的换行符
OFS:输出分隔符
ORS:输出换行符
(2)awk内置变量之数据变量:
NR:awk命令所处理的记录数。如果有多个文件,这个数目会把处理的多个文件中的行统一计数
FNR:记录正处理的行是当前这一文件中被总共处理的行中是第几行
NF:用于统计正在处理的行中的字段总数($NF:正在被处理的行中的最后一个字段)
常见的PATTERN类型:
1.regexp,正则表达式,格式为/reglar expression/
示例:
awk -F: ‘/^r/{print $1}’ /etc/passwd #显示passwd文件中以r开头的用户名
2.expression,表达式,比如$1 ~ /foo/ 或$1 == “magedu”等
示例:
awk -F: ‘$3>=500{print $1,$3}’ /etc/passwd #显示passwd文件中uid大于300的用户及其uid
awk -F: ‘$7~”bash$”{print $1,$7}’ /etc/passwd #显示passwd文件中以bash shell为shell的用户名及其对应的shell
3.BEGIN/END,特殊模式,在awk命令执行之前运行一次或结束之前运行一次
BEGIN:在awk处理文本第一行之前执行
END:在awk处理文本最后一行之前执行
实例:
awk -F: ‘BEGIN{print “Username ID Shell”}{printf “%-10s%-10s%-20s\n”,$1,$3,$7}END{print “end of report”}’ /etc/passwd #在第一行打印”Username ID Shell”,在最后一行打印”end of report”
常见的actions类型:
控制语句:
1.if-else
实例:
awk -F: ‘{if ($1==”root”) print $1,”admin”;else print $1,”common user”}’ /etc/passwd
2.while
实例:
awk -F: ‘{i=1;while (i<=3) {print $i;i++}}’ /etc/passwd
3.do-while
awk -F: ‘{i=1;do {print $i;i++}while(i<=3)}’ /etc/passwd
4.for
awk -F: ‘{for(i=1;i<=3;i++)print $i}’ /etc/passwd
5.case
6.break,continue(跳过本字段)
7.next(跳过本行)
awk使用数组:
示例:
awk -F: ‘{shell[$NF]++}END{for(A in shell){print A,shell[A]}}’ /etc/passwd #生成一个shell数组,并统计passwd文件中各种shell的个数,A指的是下标
netstat -tan | awk ‘/^tcp/{STATE{$NF}++}END{for (S IN STATE){print S,STATE[S]}}’ #生成一个STATE数组,并统计各种程序状态的个数,S指的是下标
awk ‘{counts[$1]++}END{for(ip in counts){printf “%-20s:%d\n”,ip,count[ip]}}’ /var/log/httpd/access.log #统计web日志文件中IP地址的访问量
备注:
awk中的下标很独特,可以是任意字符串