简介
- Awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于Shell脚本,完成各种自动化配置任务。
一、awk工具介绍
- 功能强大的编辑工具;
- 无交互的情况下实现复杂的文本操作。
命令格式:
awk 选项 '模式或条件{编辑指令}' 文件1 文件2... //过滤并输出文件中符合条件的内容
awk -f 脚本文件 文件1 文件2... //从脚本中调用编辑指令,过滤并输出内容
- 若需要查找出/etc/passwd的用户名、用户ID、组ID等列,执行以下awk命令即可
[root@localhost ~]# awk -F ':' '(print $1,$3,$4}' /etc/passwd
root 0 0
bin 1 1
dacmn 2 2 … //省略部分内容
二、awk工作原理
- 逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
三、awk特殊的内建变量
- FS:指定每行文本的字段分隔符,默认为空格或制表位;
- NF:当前处理的行的字段个数;
- NR:当前处理的行的行号(序数);
- $0:当前处理的行的整行内容;
- $n:当前处理行的第n个字段(第n列);
- FILENAME:被处理的文件名;
- RS:数据记录分隔,默认\n,即每行为一条记录。
四、awk的用法示例
- 按行输出文本;按字段输出文本;通过管道、双引号调用shell命令
4.1 按行输出文本
[root@localhost ~]# awk '{print}' test.txt //输出所有内容,等同于_cat test.txt
[root@localhost ~]# awk '{print $0}' test.txt //输出所有内容,等同于cat test.txt
[root@localhost ~]# awk 'NR==1, NR==3{print}' test.txt //输出第1~3行内容
[root@localhost ~]# awk '(NR>=1)&&(NR<=3){print}' test.txt //输出第1~3行内容
[root@localhost ~]# awk 'NR==1||NR==3 {print}' test.txt //输出第1行、第3行内容
[root@localhost ~]# awk '(NR%2)==1{print}' test.txt //输出所有奇数行的内容
[root@localhost ~]# awk '(NR%2)==0{print}' test.txt //输出所有偶数行的内容
[root@localhost ~]# awk '/^root/{print]' /etc/passwd //输出以root开头的行
[root@localhost ~]# awk '/nologin$/{print}' /etc/passwd //输出以nologin结尾的行
[root@localhost ~]# awk 'BEGIN{x=0};/\/bin\/bash$/{x++};END{print x}' /etc/passwd
//统计以/bin/bash 结尾的行数
[root@localhost ~]# grep -c "/bin/bash$" /etc/passwd //也是统计以/bin/bash结尾的行数
[root@localhost ~]# awk 'BEGIN{RS=""};END{print NR}' test.txt //统计以空行分隔的文本段落数
- 若需要统计用户登录系统的个数,可以用两种方法实现:
均使用管道符号调用命令wc -l
[ root@localhost ~]# awk -F: '/bash$/{print}' /etc/passwd / wc -l
5 //表示登录系统用户数
[ root@localhost ~]# awk -F: '/bash$/{print | "wc -l"}' /etc/passwd
5 //表示登录系统用户数
4.2 按字段输出文本
[root@localhost ~]# awk '{print $3}' test.txt //输出每行中(以空格或制表位分隔)的第3个字段
[root@localhost ~]# awk '{print $1,$3]' test.txt //输出每行中的第1、3个宁段
[root@localhost ~]# awk -F ":" '$2==""{print}' /etc/shadow //输出密码为空的用户的shadow记录
[root@localhost ~]# awk 'BEGIN{FS=":"};S2==""{print}' /etc/ shadow //输出密码为空的用户的shadow记录
[root@localhost ~]# awk -F ":" '$7~"/bash"{print $1}' /etc/passwd
//输出以冒号分隔且第7个字段中包含/bash的行的第1个字段,注:~表示当前用户的意思
[root@localhost ~]# awk '(Si~"nfs")&&(NF==8) {print $1, $2}' /etc/services
//输出包含8个字段且第1个字段中包含 nfs 的行的第1、2个字段
[root@localhost ~]# awk F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd
//输出第7个字段既不为 /bin/bash 也不为 /sbin/nologin 的所有行
4.3 通过管道、双引号调用shell命令
[root@localhost ~]# awk -F: '/bash$/{print | "wc -l"}' /etc/passwd //调用wc -l命令统计使用bash的用户个数
[root@localhost ~]# grep -c "bash$" /etc/passwd //也是统计使用bash的用户个数
[root@localhost ~]# awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}' //调用w命令,并用来统计在线用户数
[root@localhost ~]# awk 'BEGIN{"hostname" | getline ; print $0}' //调用hostname,并输出当前的主机名