四、awk
4.1前言
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。
数据可以来自标准输入、一个或多个文件,或其它命令的输出。
它支持用户自定义函数和动态正则表达式等先进功能,
awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),
4.2语法
awk [options] ‘commands’ filenames
options: -F 定义输入字段分隔符,默认的分隔符是空格或制表符(tab)
command(时空):BEGIN{}发生在行处理前;
{}行处理时,读一次执行一次
END{}行处理后
4.3内部变量
FS:输入字段分隔符awk -F: '{print $1, $3}' /etc/passwd | head -1
OFS:输出字段分隔符awk -F: 'BEGIN{FS=":";OFS="+++"}{print $1,$2,$3,$4}' /etc/passwd | head -1
RS:输入记录(行)分隔符,默认换行符awk 'BEGIN{RS=" "}{print $0}' a.txt
ORS:输出记录(行)分隔符,默认换行符
FNR:多文件独立编号
NR:多文件汇总编号awk -F: '{print NR, $0}' /etc/centos-release /etc/hosts
NF:字段总数awk -F: '{print NF, $0}' /etc/passwd
4.4格式化输出
print函数:
awk -F: '{print "username is: " $1 "\t uid is: " $3}' /etc/passwd | head -1
printf函数:
语法:%s 字符类型
%d 数值类型
%f 浮点型,可以定义保留
占15字符
- 表示左对齐,默认是右对齐
printf默认不会在行尾自动换行,加\n
, 逗号,输出字段分隔符
示例:
[root@localhost ~]# awk -F: '{printf "%-10s %-10s %-15s\n", $1,$2,$3}' /etc/passwd | head
4.5模式(正则表达)和动作
概念:
任何awk语句都由模式和动作组成。模式部分决定动作语句何时触发及触发事件。如果省略模式部分,动作将时刻保持执行状态。每一行都会有动作。
模式可以是任何条件语句或复合语句或正则表达式。有模式的话,就是对模式对应的行进行动作。
字符串比较:
# awk '/^root/' /etc/passwd
# awk '$0 ~ /^root/' /etc/passwd
# awk '$0!~/^root/' /etc/passwd
# awk -F: '$1 ~ /^root/' /etc/passwd
数值比较:
多条件:
4.6awk脚本编程
变量:
自定义内部变量:-v
awk -v user=root -F: '$1 == user' /etc/passwd
-v定义变量
外部变量”’”
条件&判断:
循环:
数组:
数组遍历:
案例:
1. 统计/etc/passwd中各种类型shell的数量
awk -F: '{shells[$NF]++} END{ for(i in shells){print i,shells[i]} }' /etc/passwd
2. 统计Apache/Nginx日志中的访问前十 <统计日志>
cat access_log |awk '{ips[$1]++} END{for(i in ips){print i,ips[i]} }' |sort -k2 -rn |head