一、什么是awk
1.1 awk 基本概念
awk(语言): 读取一行处理一行
是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成<font color='red'>多个字段</font>然后进行处理。AWK信息的读入也是逐行。
1.2 awk的格式
awk [选项] ‘模式条件{操作}’ 文件1 文件2...
awk -f|-v 脚本文件 文件1 文件.....
1.3 工作原理
前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。
第一步:执行BEGIN{action;… }语句块中的语句
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,
从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;…}语句块
1.4 awk 常见的内置变量
FS∶ 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
NF∶ 当前处理的行的字段个数。
NR∶ 当前处理的行的行号(序数)。
$0∶当前处理的行的整行内容。
$n∶ 当前处理行的第n个字段(第n列)。
FILENAME∶ 被处理的文件名。
RS∶ 行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’
$NF:最后一段
$(NF-1):倒数第二段
二、awk相关实例
begin 换成 end 同理
ifconfig ens33|sed -n '2p'|awk '{print $2}'
ifconfig ens33 |awk 'NR==2{print $2}'
$n,代表提取第几列
NR∶ 当前处理的行的行号(序数)
2.1 打印磁盘已经使用情况,去除 %
2.2 取出文本中的ip地址及时间
三、 NF:当前处理行的整行内容 NR:当前处理行的行号
3.1 当前处理的行的字段个数
3.2 当前处理的行的行号
#NR写在后面则在后面显示行号
#awk -F: '{print $1,NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5
sync 6
shutdown 7
halt 8
#可以用制表符
awk -F: '{print $1"\t"NR}' /etc/passwd
root 1
bin 2
daemon 3
adm 4
lp 5
#NR写在前面则在前面显示行号
awk -F: '{print NR"\t"$1}' /etc/passwd
1 root
2 bin
3 daemon
4 adm
5 lp
3.3 NR==n代表行号等于什么
3.4 NR%2==0取偶数行
3.5 NR%2==1取奇数行
3.6 NR==1,NR==4取区间行
3.7 取UID数值范围$n>1000
#取uid大于1000的行
awk -F: '$3>1000 {print}' /etc/passwd
#取uid大于等于1000的行
awk -F: '$3>=1000 {print}' /etc/passwd