1、awk内容介绍
文本与数据处理工具
可编程》处理灵活、功能强大
统计
制表
2、awk行处理方式与格式
1、awk处理方式:
1)、awk一次处理一行内容
2)、awk对每行可以切片处理’
2、awk与格式:
1)、命令行格式:$awk [options] 'command' file(s)
基本格式:$awk [options] 'command' file(s)
command:pattern {awk操作命令} 备注:pattern可以是正则表达式、也可以是逻辑表达式
操作命令:内置函数:print() printf() getline..;
控制指令:if(){...}else{...};while(){...};
扩展格式:
2)、 脚本格式:$awk -f awk-script-file file(s)
3.1、awk内置参数使用
awk 内置变量1
$0:表示整个当前行
$1:表示每行第一个字段
$2:表示每行第二个字段
awk内置参数:分隔符
optios:-F field-separator(默认为空格)
例子:打印passwd以':'分隔后的第一个字段 $ awk -F ':' '{print $1}' passwd
例子:打印passwd以':'分隔后的第一、第三个字段 $ awk -F ':' '{print $1,$3}' passwd
awk内置变量2
NR:每行的记录号
NF:字段数量变量
FILENAME:正在处理的文件名
例子:打印行记录号、字段数量、文件名 awk -F ':' '{print NR,NF,FILENAME}' passwd
3.2、awk内置参数使用案例
案例一:打印文件的每行对应的用户名、每行行号、每行的列数,并且以制表符\t区分(使用print、printf函数)
awk -F ':' '{print $1"\t"NR"\t"NF}' passwd
awk -F ':' '{printf("user:%s\tline:%s\tclo:%s\n",$1,NR,NF)}' passwd
案例二:打印文件中用户ID大于200的行号和用户名
awk -F ':' '{if ($3>200){print NR,$1}}' passwd
案例三:在服务器日志中log中找出'Error'的发生日期
awk '/Error/{print $1}' log
4、awk逻辑判断式
~,!~:匹配正则表达式
例子:匹配字母m开头的用户并打印用户名
awk -F ':' '$1~/^m.*/{print $1}' passwd
例子:排除字母m开头的用户并打印用户名
awk -F ':' '$1!~/^m.*/{print $1}' passwd
==,!=,<,>:判断逻辑表达式
例子:打印文件中用户ID大于200的行号和用户名
awk -F ':' '$3>200{print NR,$1}' passwd
例子:打印行号不等于200的行号和用户名
awk -F ':' 'NR!=200{print NR,$1}' passwd
5、awk扩展格式
格式:$awk [options] 'BEGIN {print "start"} pattern {command} END {print "end"}' file(s)
即:在行处理开始前执行BEGIN后大括号{}的内容,执行完command后执行END 后大括号{}的内容。可以理解为BEGIN后的大括号为初始化的内容,END后的大括号为收尾工作,即不参与pattern {command}的行处理。
awk -F ':' 'BEGIN{print "行号\t用户名"} $1~/^m.*/{print NR"\t"$1} END{print "================================"}' passwd
6、awk逻辑处理案例
案例一:统计当前文件夹下的文件/文件夹占用的大小
ls -l|awk 'BEGIN {size=0} {size+=$5} END{print "当前文件夹的大小是:"size/1024"k"}'
案例二:统计显示passwd的账户总人数
awk -F ':' 'BEGIN{count=0} $1!~/^$/{count++} END{print "用户数总共为:"count}' passwd
案例三:统计显示UID大于100的用户名
方法一:awk -F ':' '$3>100{print NR"\t1"$1}' passwd
方法二:awk -F ':' 'BEGIN{count=0} {if ($3>100) name[count++]=$1} END{for (i=0;i<count;i++) print i"\t"name[i]}' passwd
案例三:统计netstat -anp状态下为LISTEN和CONNECTED的连接数量
netstat -anp| awk '$6~/CONNECTED|LISTENING/{sum[$6]++} END{for (i in sum) print i"\t"sum[i]}'
7、sed、awk比较
awk和sed皆为文本处理工具
awk侧重于处理复杂逻辑,因为awk可以进行编程
sed更加的侧重于正则的处理