格式:
和sed一致分为命令行和脚本模式
$0、$1、$2...:分别表示当前行、每行第一个字段、每行第二个字段....
分隔符:
options:-F 分隔符(默认为空格)
demo:
awk -F ':' '{print $1}' /etc/passwd
# 分隔符是:,输出第三个字段,也就是用户名
awk -F ':' '{print $1,$2}' /etc/passwd
# 输出第一和第二字段,之间通过空格分隔
前面的sed方法输出用户名、UID、GID需要借助()实现,内容很长,这里可以用awk简化
awk -F ':' '{print "User:"$1 " " "UID:"$3}' passwd
NR:每行的记录号,行号
NF:字段的数量变量,列号
显示/etc/passwd每行的行号,每行的列数,对应行的用户名
awk -F ':' {print "Line:"NR,"Col:"NF,"User:"$1}' passwd
awk -F ':' '{printf("Line:%s Col:%s User:%s\n",NR,NF,$1)}' passwd
显示/etc/passwd中UID大于100的行号和用户名
awk -F ':' '{if ($3>100) print "Line:"NR,"User:"$1}' passwd
在日志中找出Error的时间信息
sed '/Error/p' tmp.log | awk '{print $1}'
awk '/Error/{print $1}' tmp.log
awk -F ':' '$1~/^m.*/{print $1}' passwd
# 匹配第一个字段开头为m的内容并打印
awk -F ':' '$1!~/^m.*/{print $1}' passwd
# 匹配第一个字段开头非m的内容并打印
awk -F ':' '$3>100{print $1,$3}' passwd
# 查找除UID大于100的用户名和UID
基本格式:
awk command 'BEGIN{print xxx}{print xxx}END{print xxx}' filename
案例1:
制表显示/etc/passwd每行的行号,每行的列数,对应行的用户名
awk -F ':' 'BEGIN{print "Line Col User"}{print NR,NF,U$1}END{print"-----"FILENAME"-----"}' passwd
计算所有文件的容量总和
ls -l | awk 'BEGIN{size=0}{size+=$5}END{print " size is " size/1024}'
统计显示/etc/passwd中账户的总数
awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print "count=" count}' passwd
统计显示UID大于100的用户名
awk -F ':' 'BEGIN{count=0}{if ($3 > 100) name[count++]=$1}END{for (i=0;i<count;i++) print i,name[i]}' passwd
统计netstat -anp状态下为LISTEN和CONNECTED的连接数量
netstat -anp | awk '$6~/CONNECTED|LISTEN/{cum[$6]++}END{for (i in sum) print i,sum[i]}'
统计一个目录下的指定格式的文件总数:
find -name "*.azw3" -print | awk -F ' ' 'BEGIN{count=0}{count++}END{print "azw3 total number =" count}'
查看目录下大于指定容量的文件名及数量
ls -l | awk 'BEGIN{i=0} {if($5>40*1024*1024){filename[i++]=$9;}} END{print "total:"i;for(j=0;j<i;j++){print "filename:"filename[j];}}'
# 查看大于大于40M的
sed和awk的区别
sed侧重于配合正则表达式一起使用
awk侧重于复杂的逻辑表达式使用