Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
终端输入awk --help可以看到所有的语法参数,翻译了部分,举例一些常用的实例
一、命令选项
1、-F 指定输入文件折分隔符,如-F:。
2、-v 赋值一个用户定义变量。
3、-f 从脚本文件中读取awk命令。
二、awk内置变量
awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FS 保存或设置字段分隔符,例如FS= ":" 与-F功能一样
RS: Record Separator,记录分隔符
ORS: Output Record Separate,输出当前记录分隔符(行分隔符)
OFS Out of Field Separator,输出字段分隔符物,其中解释了缩写的含义
$n 指定分隔的第n个字段,如 $1、$2分别表示文本的第1列、第2列依此类推
$0 文本当前行的全部内容
NR 文件当前行的行号
NF 文件当前行的列数(有几列)
三、关键调用参数
$0 表示整个当前行
$1 每行第一个字段
\t 制表符tab
\n 换行符
FS BEGIN时定义分隔符
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]*/ 一个或一个以上数字
FILENAME 文件名
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]' 定义三个分隔符
比较符号:==(等于) !=(不等于) >(大于)>=(大于等于) <(小于) <=(小于等于)
四、常用实例分析,以下实例只是常用,广泛应用需要配合其他运维工具
1、最常用实例,查看系统中的用户,-F以":"为分隔符,打印第一列
[root@master service]# awk -F ":" '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
operator
games
ftp
2、搜索/etc/passwd有root关键字的所有行
[root@master service]# awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
3、显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割,\t可以改成其他标识符
[root@master ~]# awk -F ':' '{print $1"\t"$7}' passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
4、筛选服务器IP地址
[root@master ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.252 netmask 255.255.0.0 broadcast 192.168.255.255
inet6 fe80::736e:388a:4dfe:5d00 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ec:ce:09 txqueuelen 1000 (Ethernet)
RX packets 6857322 bytes 1682683150 (1.5 GiB)
RX errors 0 dropped 154 overruns 0 frame 0
TX packets 6510893 bytes 5868937321 (5.4 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[root@master ~]# ifconfig ens33 | grep netmask | awk '{print $2}'
192.168.2.252
5、提取根的空间使用率,常用于自动清理磁盘的脚本
[root@master ~]# df -h /
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 53G 21G 30G 42% /
[root@master ~]# df -h / | awk '/\/$/{print $5}'
42%
6、打印passwd前4列内容
[root@master ~]# awk -F: '{NF=4}1' /etc/passwd
root x 0 0
bin x 1 1
daemon x 2 2
adm x 3 4
lp x 4 7
sync x 5 0
shutdown x 6 0
7、 输出其中以nologin结尾的完整记录:
[root@master ~]# awk -F: '/nologin$/{print}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
8、打印passwd第三行内容
[root@master ~]# awk -F: 'NR==3{print}' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
9、输出其中登录Shell不以nologin结尾(对第7个字段做!~反向匹配)的用户名、登录Shell信息
!~ 不匹配
[root@master ~]# awk -F: '$7!~/nologin$/{print $1,$3}' passwd
root 0
sync 5
shutdown 6
10、输出账户UID小于5的账户名称和UID信息
[root@master ~]# awk -F: '$3<5{print $1,$3}' passwd
root 0
bin 1
daemon 2
adm 3
lp 4
11、输出账户UID大于10并且小于20的账户信息,&&与,||或
[root@master ~]# awk -F: '$3>1000 && $3<2000{print $1,$3}' passwd
ceshi 1001
jenkins 1002
first_yunwei 1003
12、打印开头包含root打印出第一行和最后一行,$NF默认是最后一行
[root@master ~]# awk -F: '/^root/{print $1,$NF}' /etc/passwd
root /bin/bash
12、输出字段1,3,6,以制表符作为分隔符
[root@master ~]# awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
root 0 /root
daemon 1 /usr/sbin
bin 2 /bin