awk的使用
awk的处理方式与格式
awk的处理方式
- awk一次处理一行内容
- awk可以对每行进行切片处理
示例:
1 | awk '{print $1}' |
awk的格式
命令行格式
1 | awk [options] 'command' files |
command1:pattern {awk操作命令}
操作命令:
- 内置函数:print(),printf(),getline…
- 控制指令:if(){…}else{…},while()
脚本格式
1 | awk -f awk-script-file file(s) |
扩展格式
BEGIN{…}{…}END{…}
示例:
以制表的形式输出passwd文件中的NR,NF,User
1 | awk -F ':' 'BEGIN{print "Line\t Columns User"}{print NR"\t",NF"\t",$1}END{print "-------"FILENAME"-------"}' passwd |
结果:
1 | Line Columns User |
awk的内置参数
变量
$0 : 表示整个当前行
$1 : 表示第一个字段
$2 : 每行第二个字段
以此类推NR : 每行的记录号(行号)
NF : 字段数(以分隔符为参照物)
FILENAME : 正在处理的文件名
示例:
1 | awk -F ':' '{print NR,NF}' /etc/passwd |
结果:
1 | 1 7 |
1 | awk -F ':' '{print FILENAME}' /etc/passwd |
结果:
1 | /etc/passwd |
- ~ : 对变量进行更加详细的匹配
示例:
输出passwd文件中以a-c开头的用户名
1 | awk -F ':' '$1~/^[a-c].*/{print $1}' passwd |
结果:
1 | bin |
输出passwd文件中不以a-c开头的用户名
1 | awk -F ':' '$1!~/^[a-c].*/{print $1}' passwd |
结果:
1 | root |
- “>,<,==,!=” : 逻辑判断
示例:
输出passwd文件中UID大于80的用户名和UID
1 | awk -F ':' '$3>80{print $1,$3}' passwd |
结果:
1 | nobody 99 |
分隔符
options: -F field-separator(默认为空格)
示例:
打印passwd中的组id
1 | awk -F ':' '{print $3}' /etc/passwd |
结果:
1 | 0 |
打印passwd中的用户名和组id
1 | awk -F ':' '{print "USER:"$1," UID:"$3}' /etc/passwd |
结果:
1 | USER:root UID:0 |
案例一
显示/etc/passwd每行的行号,每行的列数,对应行的用户名(print,printf)
1 | awk -F ':' '{print "Line: " NR,"Columns: "NF,"USER: "$1}' /etc/passwd |
结果:
1 | Line: 1 Columns: 7 USER: root |
1 | awk -F ':' '{printf("Line: %3s Columns: %s USER: %s\n",NR,NF,$1)}' /etc/passwd |
结果:
1 | Line: 1 Columns: 7 USER: root |
案例二
显示/etc/passwd中用户组id大于100的行号和用户名(if(){}else{})
1 | awk -F ':' '{if ($3>100){ print "Line: "NR,"USER: "$1}else{print "组id小于100,不与展示"}}' passwd |
结果:
1 | 组id小于100,不与展示 |
案例三
显示/etc/passwd中的带有nologin的行的USER信息和组id信息
1 | sed -n '/nologin/p' /etc/passwd | awk -F ':' '{print "USER: "$1,"UID: "$3}' |
结果:
1 | USER: bin UID: 1 |
案例四
统计当前文件夹下的文件/文件夹占用的大小
1 | ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is " size "M"}' |
结果:
1 | size is 1495034M |
案例五
统计/etc/passwd的账户总人数
1 | awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print "Line is " count}' passwd |
结果:
1 | Line is 22 |
案例六
统计UID大于100的用户名
1 | awk -F ':' 'BEGIN{count=0}{if($3>100) name[count++]=$1}END{for(i=0;i<count;i++){ print i,name[i]}}' passwd |
有点蒙b…
案例七
统计netstat -anp状态下为LISTEN和OCONNECTED的链接数量
1 | netstat -anp | awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for (i in sum) {print i,sum[i]}}' |
结果:
1 | LISTEN 3 |
祝你学习愉快~~~