1.awk是Linux里面的一个文本处理命令(工具)–》程序
awk完整语法
#ENGIN{commands}: 处理数据前执行的命令
#//: 匹配代码块,可以是字符串或者正则表达式
#{commands}: 每行都执行的命令
#END{commands}: 处理数据后执行的命令
#file:指定路径的文件
awk 'BEGIN{commands}//{commands}END{commands}' file
awk的数据字段变量
$0表示整行文本
$1表示文本中第1个数据字段
$2表示文本中第2个数据字段
$n表示文本中第n个数据字段
awk用-F来指定分隔符,默认的字段分割符为空白字符(空格或TAB)
# 以:为分隔符截取/etc/passwd里的第一个字段
awk -F: '{print $1}' /etc/passwd
awk命令的操作符号
- 正则表达式
# 输出/etc/passwd下的不是以字母开头的$1
awk -F: '/^[^a-zA-Z]/{print $1}' /etc/passwd
- 数学运算: + - * / % ++ –
# 使用awk命令统计以r开头的用户数目
cat /etc/passwd |awk -F: 'BEGIN{i=0}/^r/{print $1;i++}END{print i}'
- 逻辑关系: && ||
# 截取出/etc/passwd中$3大于1000或者$3小于100的$1和$3字段
cat /etc/passwd | awk -F":" '$3>1000 ||$3<100{print $1,$3}'
# 截取出/etc/passwd中$3大于50并且$3小于100的$1和$3字段
cat /etc/passwd | awk -F":" '$3>50 && $3<100{print $1 ,$3}'
- 比较操作符: > < >= != <= == ~ !~( ==为精确匹配 ~为模糊匹配)
# 截取出/etc/passwd下第三个字段是三个字符的$1和$3(一个.代表一个字符串 .{3}代表3个字符)
awk -F: '$3~/\<.{3}\>/ {print $1,$3}' /etc/passwd
awk命令的内置变量
- NR代表当前处理行号
# 输出passwd下行号为5的行和行号
cat /etc/passwd |awk 'NR==5{print NR,$0}'
- NF 为处理行的最后一个字段
# 输出passwd下以:为分隔符每行的最后一个字段
cat /etc/passwd |awk -F: '{print $NF}'
- FS 当前的输入分隔符,默认是空白字符(field separator),OFS 当前的输出分割符,默认为空格字符(output field separator)
# 将passwd里面的输入分割符号:变为输出分割符#
cat /etc/passwd|awk 'FS=":";OFS="#"{print NR,$0,$NF}'
awk命令的结构化语句if/else
#案例:/etc/passwd下$3是uid 用户的编号,如果用户的编号是0 --》管理员,1~999 --》程序用户,大于1000 ---》普通用户,最后统计出有多少管理员,多少程序用户,多少普通用户
cat /etc/passwd |awk -F: 'BEGIN{a=b=c=0}{if($3==0){a++;print $1}else if($3>0&&$3<=999){b++;print $1}else {c++;print $1}}END{print "管理员个数:"a" 程序用户个数:"b " 普通用户个数:"c}'
# 统计access.log里状态码的情况
awk 'BEGIN{a=b=c=d=0}{if($9>=200&&$9<300){a++}else if($9>=300&&$9<400){b++}else if($9>=400&&$9<500){c++}else{d++}}END{print "2xx:"a,"3xx:"b,"4xx:"c,"5xx:"d}' access.log