awk 处理方式
awk 一次处理一行内容
awk 对每行可以切片处理
1awk '{print $1}' #输出首个单词
使用 awk-格式
- 命令行格式
1awk [options] 'command' files
- 脚本格式
1awk -f awk-script-file files
- awk 内置变量 1
1$0 表示整个当前行
2$1 每行第一个字段
3$2 每行第二个字段
4NR 每行的记录号
5NF 字段数量变量/字段总数
6FILENAME 正在处理的文件名
- awk 内置参数 分隔符
1options : -F field-separator(默认为空格)
2
3awk -F ':' '{print $3}' /etc/passwd
4
5下面的花式加东西
6
7awk -F ':' '{print $1,$3}' passwd
8
9awk -F ':' '{print $1" "$3}' passwd
10
11awk -F ':' '{print $1"\t"$3}' passwd
12
13awk -F ':' '{print "USER:"$1,"\t""UID:"$3}' passwd
14
- 逻辑判断式
1~ !~ 匹配正则表达式
2
3== != < > 判断逻辑表达式
4
5awk -F ':' '$1~/^m.*/{print $1}' passwd
6匹配m开头的,并输出第一个字符串
7
8
9awk -F ':' '$1!~/^m.*/{print $1}' passwd
10不匹配m开头的,并输出第一个字符串
11
12awk -F ':' '$3==100{print $1,$3}' passwd
13第三个字符串等于100 的输出第一个字符串和第三个字符串
14
15
16awk -F ':' '$3!=100{print $1,$3}' passwd
17第三个字符串不等于100 的输出第一个字符串和第三个字符串
案例
- 案例一
显示/etc/passwd
每行的行号,每行的列数,对应行的用户名(print,printf
)
1awk -F ':' {'print "Line: "NR, "Col: "NF,"User:"$1}' passwd
2
3awk -F ':' '{printf("Line:%s Col:%s User:%s",NR,NF,$1)}' passwd
4
5awk -F ':' '{printf("Line:%s Col:%s User:%s\n",NR,NF,$1)}' passwd #增加\n
6
7awk -F ':' '{printf("Line:%3s Col:%s User:%s\n",NR,NF,$1)}' passwd #字符数%3s
- 案例二
显示/etc/passwd 中用户 ID 大于 100 的行号和用户名(if....else....
)
1awk -F ':' '{if ($3>100) print "Line: "NR,"User: "$1}' passwd
- 案例三
找出服务器日志中的报错
1awk '/Error/{print $1}' log中先定位Error所在行
- 案例四
制表显示/etc/passwd 每行的行号,每行的列数,对应行的用户名
1awk -F ':' 'BEGIN{print "line Colun user"}{print NR,NF,$1}END{print "--------"FILENAME"--------"}' passwd
2
3BEGIN{}可以看成是循环的开始,作初始化用,END{ }代表结束前的处理,中间是循环体
- 案例五
统计当前文件夹下的文件/文件夹占用的大小
1ls -l|awk 'BEGIN{size=0}{size+=$5}END{print "size is:"size/1024/1024"M"}'
2
3定义变量统计当前目录下的文件/目录占用的大小
- 案例六
统计显示/etc/passwd 的账户总人数
1awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print " count = "count}' passwd
- 案例七
统计显示 UID 大于 100 的用户名
1awk -F ':' 'BEGIN{count=0}{if($3>100)name[count++]=$1}END{for (i=0;i<count;i++) print i,name[i]}'
2
3passwd统计显示/etc/passwd的账户总人数,用数组存用户名再循环打印
- 案例八
统计 netstat -anp 的连接数
1netstat -anp|awk '$6~/CONNECTED/{sum[$6]++}$7~/LISTENING/{sum[$7]++}END{for(i in sum) print i,sum[i]}'
2
3统计连接数