逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
基本格式
awk [参数] [处理内容] [操作对象]
参数详情
-F 设置分隔符
print 打印
NF 统计以分隔符分开的字段有多少个(变量)
$ 取值
awk运行处理规则的执行流程
- BEGIN{}:表示在开始匹配之前执行一次,通常用于初始化一些变量或设置一些条件。
- //:表示正则表达式的开始和结束标志,用于包裹整个正则表达式。
- {}:表示一个捕获组,用于从匹配结果中提取出需要的信息。
- END{}:表示在匹配结束后执行一次,通常用于对匹配结果进行一些处理或输出。
这些元素可以组合使用,也可以单独使用,最少有一个,最多有四个。
查看/etc/passwd 的第一列内容
使用-F 设置分割符为冒号(:)
使用print $1 设置为输出第一行的第一个字段
/etc/passwd 指定文件
[root@LDP ~]# awk -F':' '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-coredump
dbus
tss
sssd
chrony
sshd
systemd-oom
dhcpd
使用默认的分隔符 (空格)
显示不出来
[root@LDP ~]# awk '{print $1}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP
nobody:x:65534:65534:Kernel
systemd-coredump:x:999:997:systemd
dbus:x:81:81:System
tss:x:59:59:Account
sssd:x:998:996:User
chrony:x:997:995:chrony
sshd:x:74:74:Privilege-separated
systemd-oom:x:993:993:systemd
dhcpd:x:177:177:DHCP
统计每一行的字段数量
也是使用-F作为分隔符,NF统计字段数量
[root@LDP ~]# awk -F ':' '{ print NF}' /etc/passwd
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
输出第三个和单倒数第一个字段
这里就是使用NF变量,在这里就是使出该文件的最后的一个字段
[root@LDP ~]# awk -F ':' '{print $3 $(NF)}' /etc/passwd
0/bin/bash
1/sbin/nologin
2/sbin/nologin
3/sbin/nologin
4/sbin/nologin
5/bin/sync
6/sbin/shutdown
7/sbin/halt
8/sbin/nologin
11/sbin/nologin
12/sbin/nologin
14/sbin/nologin
65534/sbin/nologin
999/sbin/nologin
81/sbin/nologin
59/sbin/nologin
998/sbin/nologin
997/sbin/nologin
74/usr/sbin/nologin
993/usr/sbin/nologin
177/sbin/nologin
输出第三个和单倒数第二个字段
这里的$(NF-1) 就是代表倒数第二,因为NF是统计每一行的字段有多少,-1就是代表倒数第二
[root@LDP ~]# awk -F ':' '{print $3 $(NF-1)}' /etc/passwd
0/root
1/bin
2/sbin
3/var/adm
4/var/spool/lpd
5/sbin
6/sbin
7/sbin
8/var/spool/mail
11/root
12/usr/games
14/var/ftp
65534/
999/
81/
59/
998/
997/var/lib/chrony
74/usr/share/empty.sshd
993/
177/
使用逗号分隔(,)
在条件print $3 和$(NF-1)中间加上逗号就是将输出的内容使用空格分开,方便查看
[root@LDP ~]# awk -F ':' '{print $3 ,$(NF-1)}' /etc/passwd
0 /root
1 /bin
2 /sbin
3 /var/adm
4 /var/spool/lpd
5 /sbin
6 /sbin
7 /sbin
8 /var/spool/mail
11 /root
12 /usr/games
14 /var/ftp
65534 /
999 /
81 /
59 /
998 /
997 /var/lib/chrony
74 /usr/share/empty.sshd
993 /
177 /
输出行号
变量NR
表示当前输出行号
[root@LDP ~]# awk -F ':' '{print NR ") " $1}' /etc/passwd
1) root
2) bin
3) daemon
4) adm
5) lp
6) sync
7) shutdown
8) halt
9) mail
10) operator
11) games
12) ftp
13) nobody
14) systemd-coredump
15) dbus
16) tss
17) sssd
18) chrony
19) sshd
20) systemd-oom
21) dhcpd
将输出的内容编号
使用NR 编号 并添加花括号
花括号后面的空格为编号和花括号 和输出内容的间距,$1 代表针对第一行内容进行操作。
[root@LDP ~]# awk -F ':' '{print NR "} " $1 }' /etc/passwd
1} root
2} bin
3} daemon
4} adm
5} lp
6} sync
7} shutdown
8} halt
9} mail
10} operator
11} games
12} ftp
13} nobody
14} systemd-coredump
15} dbus
16} tss
17} sssd
18} chrony
19} sshd
20} systemd-oom
21} dhcpd
查找关键字
具体查找的内容为 /usr
print $0 将查找出来的行,全部显示出来
[root@LDP ~]# awk -F ':' '/usr/ {print $0}' /etc/passwd
games:x:12:100:games:/usr/games:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/usr/sbin/nologin
systemd-oom:x:993:993:systemd Userspace OOM Killer:/:/usr/sbin/nologin
只打印第一个字段的内容
[root@LDP ~]# awk -F ':' '/usr/ {print $1}' /etc/passwd
games
sshd
systemd-oom
匹配root开头的行
[root@LDP ~]# awk -F ":" ' /^root/ {print $0 }' /etc/passwd
root:x:0:0:root:/root:/bin/bash
打印最后一行为/bash/结尾的行
这里就是使用NF便用变量(NF代表这一行的字段数量),查找以/bash结尾的行
~ 表示包含
[root@LDP ~]# awk -F ':' '$NF ~ /bash/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
打印最后一行不为/bash结尾的行
!~ 表示不包含
[root@LDP ~]# awk -F ":" '$NF !~ /bash/{print $0}' /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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
输出指定行数后面的行
这里就是输出第一行之后的行,并只打印第一个字段。
[root@LDP ~]# awk -F ':' 'NR >1 {print $1}' /etc/passwd
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-coredump
dbus
tss
sssd
chrony
sshd
systemd-oom
dhcpd
查找内容多个内容
查找内容,以root halt ftp 开头的行,并只显示该行的第一个字段
[root@LDP ~]# awk -F ':' '$1 == "root" || $1 == "halt" || $1 == "ftp" {print $1}' /etc/passwd
root
halt
ftp
显示行号
NR"} " 花括号后面的空格可以自己调节。
[root@LDP ~]# awk -F ':' '$1 == "root" || $1 == "halt" || $1 == "ftp" {print NR"} " $1 }' /etc/passwd
1} root
8} halt
12} ftp
指定分隔符的方式(BEGIN)
print 打印多个字符需要使用逗号(,)分隔
[root@LDP ~]# awk 'BEGIN{ FS=":"} {print $NF,$2}' /etc/passwd
/bin/bash x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/bin/sync x
/sbin/shutdown x
/sbin/halt x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/sbin/nologin x
/usr/sbin/nologin x
/usr/sbin/nologin x
/sbin/nologin x
将输出的内容中间添加分割符
OFS : 指定打印分隔符(默认空格),就是将查找出来的多个字段,使用OFS指定的分隔符插入到两个字段中间,方便查看。
[root@LDP ~]# awk -F ":" 'BEGIN{OFS=" "}{print $NF, $1}' /etc/passwd
/bin/bash root
/sbin/nologin bin
/sbin/nologin daemon
/sbin/nologin adm
/sbin/nologin lp
/bin/sync sync
/sbin/shutdown shutdown
/sbin/halt halt
/sbin/nologin mail
/sbin/nologin operator
/sbin/nologin games
/sbin/nologin ftp
/sbin/nologin nobody
/sbin/nologin systemd-coredump
/sbin/nologin dbus
/sbin/nologin tss
/sbin/nologin sssd
/sbin/nologin chrony
/usr/sbin/nologin sshd
/usr/sbin/nologin systemd-oom
/sbin/nologin dhcpd
[root@LDP ~]# awk -F ":" 'BEGIN{OFS=" {}{} "}{print $NF, $1}' /etc/passwd
/bin/bash {}{} root
/sbin/nologin {}{} bin
/sbin/nologin {}{} daemon
/sbin/nologin {}{} adm
/sbin/nologin {}{} lp
/bin/sync {}{} sync
/sbin/shutdown {}{} shutdown
/sbin/halt {}{} halt
/sbin/nologin {}{} mail
/sbin/nologin {}{} operator
/sbin/nologin {}{} games
/sbin/nologin {}{} ftp
/sbin/nologin {}{} nobody
/sbin/nologin {}{} systemd-coredump
/sbin/nologin {}{} dbus
/sbin/nologin {}{} tss
/sbin/nologin {}{} sssd
/sbin/nologin {}{} chrony
/usr/sbin/nologin {}{} sshd
/usr/sbin/nologin {}{} systemd-oom
/sbin/nologin {}{} dhcpd
awk函数
print : 打印
printf : 格式化打印
%s : 字符串
%d : 数字
- : 左对齐
+ : 右对齐
15 : 至少占用15字符
格式化输出内容
在打印出来的内容前后添加符号
{printf "{%+10s|%-20s_\n",$1,$2}
printf 格式化输出 (想使用格式化输出的话,必须使用 printf)
"{%+10s 使用花括号为每一行的第一个字符,并向后延申10个空格
|%-20s_ 添加条件 在每一行输出的最后字符后延申20个空格,输出_符号
[root@LDP ~]# awk -F ":" 'BEGIN{OSF="|"}{printf "{%+10s|%-20s_\n",$1,$2}' /etc/passwd
{ root|x _
{ bin|x _
{ daemon|x _
{ adm|x _
{ lp|x _
{ sync|x _
{ shutdown|x _
输出第七行
使用NR == 7 指定输出第七行
[root@LDP ~]# awk -F ":" 'NR == 7{print $0}' /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
运算
&&
逻辑与(AND)操作符用于连接两个条件,当且仅当两个条件都为真时,整个表达式的结果才为真。如果第一个条件为假,则不会计算第二个条件,因为无论第二个条件的结果如何,整个表达式的结果都已经确定为假。
||
逻辑或(OR)操作符也用于连接两个条件,如果至少有一个条件为真,则整个表达式的结果为真。如果第一个条件为真,则不会计算第二个条件,因为无论第二个条件的结果如何,整个表达式的结果都已经确定为真。
!
逻辑非(NOT)操作符用于反转一个条件的真假值。如果条件为真,则应用逻辑非操作后结果为假;如果条件为假,则结果为真。
第3个字段($3)加上第4个字段($4)大于2000,且第3个字段($3)乘以第4个字段($4)大于400。如果满足条件,就输出整行内容。
[root@LDP ~]# awk -F ":" '$3 + $4 > 2000 && $3 * $4 >400{print $0}' /etc/passwd
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
第3个字段($3)加上第4个字段($4)大于20,或者第3个字段($3)乘以第4个字段($4)大于2000。如果满足条件,就输出整行内容。
[root@LDP ~]# awk -F: '$3 + $4 > 20 || $3 * $4 > 2000{print $0}' /etc/passwd
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/:/sbin/nologin
sssd:x:998:996:User for sssd:/:/sbin/nologin
chrony:x:997:995:chrony system user:/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/usr/sbin/nologin
systemd-oom:x:993:993:systemd Userspace OOM Killer:/:/usr/sbin/nologin
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
[root@LDP ~]# awk -F: '!($3 + $4 > 9000){print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used for TPM access:/:/sbin/nologin
sssd:x:998:996:User for sssd:/:/sbin/nologin
chrony:x:997:995:chrony system user:/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/usr/sbin/nologin
systemd-oom:x:993:993:systemd Userspace OOM Killer:/:/usr/sbin/nologin
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
查找第3个字段加上第4个字段不大于10的行
!代表取反
[root@LDP ~]# awk -F: '!($3 + $4 > 10){print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt