目录
一、awk命令的定义
1、awk的命令原理
逐行读取文本,默认以空格或tab键为分割符进行分割,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
sed命令常用于一整行的整理,而awk命令比较倾向于将一行分成多个“字段”然后再进行处理。
awk信息的读取也是整行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的工程中,可以使用逻辑操作符,"&&" 表示"与"、"||"表示"或"、"!"表示"非",还可以进行简单的数学运算。
2、awk的命令格式
awk 选项 '模式或条件 {操作}' 文件1 或 文件 2
awk -f 脚本文件 文件1 文件 2
3、awk的内建变量
(1)FS
列分隔符。指定每行文本字段的分隔符,默认为空格和制表位。与"-F"作用相同。
(2)NF
当前处理行的字段个数
(3)NR
当前处理行的行号
(4)$0
当前处理行的整行内容
(5)$n
当前处理行的第n个字段
(6)FILENAME
被处理的文件名
(7)RS
行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n'
二、awk命令的运用
1、打印磁盘使用情况
[root@localhost ~]# df |awk '{print $5}'
已用%
26%
0%
0%
1%
0%
19%
1%
0%
2、提取ip地址和mac地址
(1)提取ip地址
[root@localhost ~]# ifconfig|sed -n '2p'|awk '{print $2}'
192.168.222.100
(2) 提取mac地址
[root@localhost ~]# ifconfig|sed -n '3p'|awk '{print $2}'
fe80::aa6c:cf48:3e30:55a9
3、根据列分隔符提取
FS∶ 列分割符提取列
使用分隔符过滤出root用户和它使用的shell
NR
当前处理的行的行号
查看用户zs的行号
[root@localhost ~]# awk -F":" '/^zs/ {print $1,NR}' /etc/passwd
zs 41
4、使用BEGIN输出包含指定字符的行并统计有多行
BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;
awk再处理指定的文本,之后再执行END模式中指定的动作;
END{ } 语句块中,往往会放入打印结果等语句。
[root@localhost ~]# awk 'BEGIN {x=0};/\/bin\/bash$/;{x++};END{print x}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
zs:x:1000:1000:zs:/home/zs:/bin/bash
41