Linux 三剑客之 awk

柳三千

文章最后更新时间:2025年02月03日

前言

image.png

常见内置变量:

$0:代表当前正在处理的整行内容。
$1, $2, ...:分别表示当前行的第 1 个字段、第 2 个字段,依此类推。
NF:表示当前行的字段数量。
NR:表示当前处理的行号。
FS:输入字段分隔符,默认是空格或制表符,可通过 -F 选项或在 awk 脚本里修改。
OFS:输出字段分隔符,默认是空格。


实战训练

[ldx@VM-20-5-opencloudos ~]$ cat test.txt 
John 25 Engineer
Alice 30 Manager
Bob 22 Developer


[ldx@VM-20-5-opencloudos ~]$ awk '{print $0}' test.txt 
John 25 Engineer
Alice 30 Manager
Bob 22 Developer

[ldx@VM-20-5-opencloudos ~]$ awk '{print $1 $2 $3}' test.txt 
John25Engineer
Alice30Manager
Bob22Developer

[ldx@VM-20-5-opencloudos ~]$ awk '{print $0}' test.txt 
John 25 Engineer
Alice 30 Manager
Bob 22 Developer

[ldx@VM-20-5-opencloudos ~]$ awk '{print "姓名:"$1,"年龄:"$2,"职位:"$3}' test.txt 
姓名:John 年龄:25 职位:Engineer
姓名:Alice 年龄:30 职位:Manager
姓名:Bob 年龄:22 职位:Developer
姓名: 年龄: 职位:
[ldx@VM-20-5-opencloudos ~]$ cat test.txt 
John 25 Engineer
Alice 30 Manager
Bob 22 Developer

#修改分隔符为 #
[ldx@VM-20-5-opencloudos ~]$ sed -i 's/ /#/g' test.txt 
[ldx@VM-20-5-opencloudos ~]$ cat test.txt 
John#25#Engineer
Alice#30#Manager
Bob#22#Developer

[ldx@VM-20-5-opencloudos ~]$ awk '{print $1,$2}' test.txt 
John#25#Engineer 
Alice#30#Manager 
Bob#22#Developer 
 
#指定分隔符
[ldx@VM-20-5-opencloudos ~]$ awk -F '#' '{print $1,$2}' test.txt 
John 25
Alice 30
Bob 22

#打印 2-3行
[ldx@VM-20-5-opencloudos ~]$ cat test.txt 
John#25#Engineer
Alice#30#Manager
Bob#22#Developer

[ldx@VM-20-5-opencloudos ~]$ awk 'NR==2,NR==3' test.txt 
Alice#30#Manager
Bob#22#Developer

#打印18-21行并打印行号
[ldx@VM-20-5-opencloudos ~]$ cat /etc/passwd > test.txt
[ldx@VM-20-5-opencloudos ~]$ cat test.txt 
root:x:0:0:Super User:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/sbin/nologin
daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/usr/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:/usr/sbin/nologin
operator:x:11:0:operator:/root:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/usr/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/usr/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/usr/sbin/nologin
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/usr/sbin/nologin
systemd-oom:x:998:998:systemd Userspace OOM Killer:/:/usr/sbin/nologin
polkitd:x:997:997:User for polkitd:/:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
chrony:x:996:996::/var/lib/chrony:/sbin/nologin
saslauth:x:995:76::/run/saslauthd:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
nslcd:x:994:995:nslcd ldap user:/:/sbin/nologin
arpwatch:x:77:77:Arpwatch service user:/var/lib/arpwatch:/sbin/nologin
tcpdump:x:72:72:tcpdump:/:/sbin/nologin
systemd-coredump:x:993:993:systemd Core Dumper:/:/usr/sbin/nologin
systemd-timesync:x:992:992:systemd Time Synchronization:/:/usr/sbin/nologin
lighthouse:x:1000:1000::/home/lighthouse:/bin/bash
ldx:x:1001:1001::/home/ldx:/bin/bash


[ldx@VM-20-5-opencloudos ~]$ awk 'NR==18,NR==21{print NR,$0}' test.txt 
18 polkitd:x:997:997:User for polkitd:/:/sbin/nologin
19 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
20 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
21 avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin

#打印第一列,倒数第二列,最后一列
[ldx@VM-20-5-opencloudos ~]$ nl test.txt 
     1	root:x:0:0:Super User:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/usr/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/usr/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8	halt:x:7:0:halt:/sbin:/sbin/halt
     9	mail:x:8:12:mail:/var/spool/mail:/usr/sbin/nologin
    10	operator:x:11:0:operator:/root:/usr/sbin/nologin
    11	games:x:12:100:games:/usr/games:/usr/sbin/nologin
    12	ftp:x:14:50:FTP User:/var/ftp:/usr/sbin/nologin
    13	nobody:x:65534:65534:Kernel Overflow User:/:/usr/sbin/nologin
    14	tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
    15	dbus:x:81:81:System message bus:/:/sbin/nologin
    16	systemd-network:x:192:192:systemd Network Management:/:/usr/sbin/nologin
    17	systemd-oom:x:998:998:systemd Userspace OOM Killer:/:/usr/sbin/nologin
    18	polkitd:x:997:997:User for polkitd:/:/sbin/nologin
    19	rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
    20	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
    21	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
    22	chrony:x:996:996::/var/lib/chrony:/sbin/nologin
    23	saslauth:x:995:76::/run/saslauthd:/sbin/nologin
    24	nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
    25	sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
    26	nslcd:x:994:995:nslcd ldap user:/:/sbin/nologin
    27	arpwatch:x:77:77:Arpwatch service user:/var/lib/arpwatch:/sbin/nologin
    28	tcpdump:x:72:72:tcpdump:/:/sbin/nologin
    29	systemd-coredump:x:993:993:systemd Core Dumper:/:/usr/sbin/nologin
    30	systemd-timesync:x:992:992:systemd Time Synchronization:/:/usr/sbin/nologin
    31	lighthouse:x:1000:1000::/home/lighthouse:/bin/bash
    32	ldx:x:1001:1001::/home/ldx:/bin/bash

[ldx@VM-20-5-opencloudos ~]$ awk -F ':' '{print $1,$(NF-1),$NF}' test.txt 
root /root /bin/bash
bin /bin /usr/sbin/nologin
daemon /sbin /usr/sbin/nologin
adm /var/adm /usr/sbin/nologin
lp /var/spool/lpd /usr/sbin/nologin
sync /sbin /bin/sync
shutdown /sbin /sbin/shutdown
halt /sbin /sbin/halt
mail /var/spool/mail /usr/sbin/nologin
operator /root /usr/sbin/nologin
games /usr/games /usr/sbin/nologin
ftp /var/ftp /usr/sbin/nologin
nobody / /usr/sbin/nologin
tss /dev/null /sbin/nologin
dbus / /sbin/nologin
systemd-network / /usr/sbin/nologin
systemd-oom / /usr/sbin/nologin
polkitd / /sbin/nologin
rpc /var/lib/rpcbind /sbin/nologin
rpcuser /var/lib/nfs /sbin/nologin
avahi /var/run/avahi-daemon /sbin/nologin
chrony /var/lib/chrony /sbin/nologin
saslauth /run/saslauthd /sbin/nologin
nscd / /sbin/nologin
sshd /usr/share/empty.sshd /sbin/nologin
nslcd / /sbin/nologin
arpwatch /var/lib/arpwatch /sbin/nologin
tcpdump / /sbin/nologin
systemd-coredump / /usr/sbin/nologin
systemd-timesync / /usr/sbin/nologin
lighthouse /home/lighthouse /bin/bash
ldx /home/ldx /bin/bash    
    
    
#打印第一列和最后一列
[ldx@VM-20-5-opencloudos ~]$ awk -F ':' '{print $1,$NF}' test.txt 
root /bin/bash
bin /usr/sbin/nologin
daemon /usr/sbin/nologin
adm /usr/sbin/nologin
lp /usr/sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /usr/sbin/nologin
operator /usr/sbin/nologin
games /usr/sbin/nologin
ftp /usr/sbin/nologin
nobody /usr/sbin/nologin
tss /sbin/nologin
dbus /sbin/nologin
systemd-network /usr/sbin/nologin
systemd-oom /usr/sbin/nologin
polkitd /sbin/nologin
rpc /sbin/nologin
rpcuser /sbin/nologin
avahi /sbin/nologin
chrony /sbin/nologin
saslauth /sbin/nologin
nscd /sbin/nologin
sshd /sbin/nologin
nslcd /sbin/nologin
arpwatch /sbin/nologin
tcpdump /sbin/nologin
systemd-coredump /usr/sbin/nologin
systemd-timesync /usr/sbin/nologin
lighthouse /bin/bash
ldx /bin/bash


#与上面命令对比差距,没有$的 NF是指这个被分成 7 列
[ldx@VM-20-5-opencloudos ~]$ awk -F ':' '{print $1,NF}' test.txt 
root 7
bin 7
daemon 7
adm 7
lp 7
sync 7
shutdown 7
halt 7
mail 7
operator 7
games 7
ftp 7
nobody 7
tss 7
dbus 7
systemd-network 7
systemd-oom 7
polkitd 7
rpc 7
rpcuser 7
avahi 7
chrony 7
saslauth 7
nscd 7
sshd 7
nslcd 7
arpwatch 7
tcpdump 7
systemd-coredump 7
systemd-timesync 7
lighthouse 7
ldx 7
 
 
 #获取本机 IP 地址
 [ldx@VM-20-5-opencloudos ~]$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.20.5  netmask 255.255.252.0  broadcast 10.0.23.255
        inet6 fe80::8b66:86fb:65bc:4fc6  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:fd:e4:45  txqueuelen 1000  (Ethernet)
        RX packets 5729734  bytes 1767493215 (1.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4794557  bytes 770954866 (735.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

        
[ldx@VM-20-5-opencloudos ~]$ ifconfig eth0 | awk 'NR==2{print $2}'
10.0.20.5

#OFS指定输出分隔符
[ldx@VM-20-5-opencloudos ~]$ cat test.txt 
root:x:0:0:Super User:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/sbin/nologin
daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/usr/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:/usr/sbin/nologin
operator:x:11:0:operator:/root:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/usr/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/usr/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/usr/sbin/nologin
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/usr/sbin/nologin
systemd-oom:x:998:998:systemd Userspace OOM Killer:/:/usr/sbin/nologin
polkitd:x:997:997:User for polkitd:/:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
chrony:x:996:996::/var/lib/chrony:/sbin/nologin
saslauth:x:995:76::/run/saslauthd:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin
nslcd:x:994:995:nslcd ldap user:/:/sbin/nologin
arpwatch:x:77:77:Arpwatch service user:/var/lib/arpwatch:/sbin/nologin
tcpdump:x:72:72:tcpdump:/:/sbin/nologin
systemd-coredump:x:993:993:systemd Core Dumper:/:/usr/sbin/nologin
systemd-timesync:x:992:992:systemd Time Synchronization:/:/usr/sbin/nologin
lighthouse:x:1000:1000::/home/lighthouse:/bin/bash
ldx:x:1001:1001::/home/ldx:/bin/bash

#默认输出分隔符是空格
[ldx@VM-20-5-opencloudos ~]$ awk -F ":" '{print $1,$(NF)}' test.txt 
root /bin/bash
bin /usr/sbin/nologin
daemon /usr/sbin/nologin
adm /usr/sbin/nologin
lp /usr/sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /usr/sbin/nologin
operator /usr/sbin/nologin
games /usr/sbin/nologin
ftp /usr/sbin/nologin
nobody /usr/sbin/nologin
tss /sbin/nologin
dbus /sbin/nologin
systemd-network /usr/sbin/nologin
systemd-oom /usr/sbin/nologin
polkitd /sbin/nologin
rpc /sbin/nologin
rpcuser /sbin/nologin
avahi /sbin/nologin
chrony /sbin/nologin
saslauth /sbin/nologin
nscd /sbin/nologin
sshd /sbin/nologin
nslcd /sbin/nologin
arpwatch /sbin/nologin
tcpdump /sbin/nologin
systemd-coredump /usr/sbin/nologin
systemd-timesync /usr/sbin/nologin
lighthouse /bin/bash
ldx /bin/bash

#最终效果
[ldx@VM-20-5-opencloudos ~]$ awk -F ":" -v OFS="---" '{print $1,$(NF)}' test.txt 
root---/bin/bash
bin---/usr/sbin/nologin
daemon---/usr/sbin/nologin
adm---/usr/sbin/nologin
lp---/usr/sbin/nologin
sync---/bin/sync
shutdown---/sbin/shutdown
halt---/sbin/halt
mail---/usr/sbin/nologin
operator---/usr/sbin/nologin
games---/usr/sbin/nologin
ftp---/usr/sbin/nologin
nobody---/usr/sbin/nologin
tss---/sbin/nologin
dbus---/sbin/nologin
systemd-network---/usr/sbin/nologin
systemd-oom---/usr/sbin/nologin
polkitd---/sbin/nologin
rpc---/sbin/nologin
rpcuser---/sbin/nologin
avahi---/sbin/nologin
chrony---/sbin/nologin
saslauth---/sbin/nologin
nscd---/sbin/nologin
sshd---/sbin/nologin
nslcd---/sbin/nologin
arpwatch---/sbin/nologin
tcpdump---/sbin/nologin
systemd-coredump---/usr/sbin/nologin
systemd-timesync---/usr/sbin/nologin
lighthouse---/bin/bash
ldx---/bin/bash

#输出分隔符为制表符
[ldx@VM-20-5-opencloudos ~]$ awk -F ":" -v OFS="\t" '{print $1,$(NF)}' test.txt 
root	/bin/bash
bin	/usr/sbin/nologin
daemon	/usr/sbin/nologin
adm	/usr/sbin/nologin
lp	/usr/sbin/nologin
sync	/bin/sync
shutdown	/sbin/shutdown
halt	/sbin/halt
mail	/usr/sbin/nologin
operator	/usr/sbin/nologin
games	/usr/sbin/nologin
ftp	/usr/sbin/nologin
nobody	/usr/sbin/nologin
tss	/sbin/nologin
dbus	/sbin/nologin
systemd-network	/usr/sbin/nologin
systemd-oom	/usr/sbin/nologin
polkitd	/sbin/nologin
rpc	/sbin/nologin
rpcuser	/sbin/nologin
avahi	/sbin/nologin
chrony	/sbin/nologin
saslauth	/sbin/nologin
nscd	/sbin/nologin
sshd	/sbin/nologin
nslcd	/sbin/nologin
arpwatch	/sbin/nologin
tcpdump	/sbin/nologin
systemd-coredump	/usr/sbin/nologin
systemd-timesync	/usr/sbin/nologin
lighthouse	/bin/bash
ldx	/bin/bash


awk 变量

image.png

image.png

#FS
[ldx@VM-20-5-opencloudos ~]$ cat test.txt 
root:x:0:0:Super User:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/sbin/nologin
daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/usr/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:/usr/sbin/nologin
operator:x:11:0:operator:/root:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/usr/sbin/nologin

[ldx@VM-20-5-opencloudos ~]$ awk -v FS=":" '{print $1}' test.txt 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games


#FNR
[ldx@VM-20-5-opencloudos ~]$ awk '{print NR $0}' test.txt system_log.txt 
1root:x:0:0:Super User:/root:/bin/bash
2bin:x:1:1:bin:/bin:/usr/sbin/nologin
3daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
4adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
5lp:x:4:7:lp:/var/spool/lpd:/usr/sbin/nologin
6sync:x:5:0:sync:/sbin:/bin/sync
7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8halt:x:7:0:halt:/sbin:/sbin/halt
9mail:x:8:12:mail:/var/spool/mail:/usr/sbin/nologin
10operator:x:11:0:operator:/root:/usr/sbin/nologin
11games:x:12:100:games:/usr/games:/usr/sbin/nologin
12[2024-01-01 10:00:00] INFO: System started successfully.
13[2024-01-01 10:05:00] WARN: Disk space is low, only 10GB left.
14[2024-01-01 10:10:00] ERROR: Database connection failed.
15[2024-01-01 10:15:00] INFO: User "John" logged in.
16[2024-01-01 10:20:00] DEBUG: Query executed: SELECT * FROM users;
17[2024-01-01 10:25:00] INFO: Service "WebServer" started.
18[2024-01-01 10:30:00] WARN: High CPU usage detected, 90%.
19[2024-01-01 10:35:00] ERROR: File not found: /var/www/html/index.html.
20[2024-01-01 10:40:00] INFO: User "Alice" logged out.
21[2024-01-01 10:45:00] DEBUG: Memory allocation: 512MB.
22



[ldx@VM-20-5-opencloudos ~]$ awk '{print FNR $0}' test.txt system_log.txt 
1root:x:0:0:Super User:/root:/bin/bash
2bin:x:1:1:bin:/bin:/usr/sbin/nologin
3daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
4adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
5lp:x:4:7:lp:/var/spool/lpd:/usr/sbin/nologin
6sync:x:5:0:sync:/sbin:/bin/sync
7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8halt:x:7:0:halt:/sbin:/sbin/halt
9mail:x:8:12:mail:/var/spool/mail:/usr/sbin/nologin
10operator:x:11:0:operator:/root:/usr/sbin/nologin
11games:x:12:100:games:/usr/games:/usr/sbin/nologin
1[2024-01-01 10:00:00] INFO: System started successfully.
2[2024-01-01 10:05:00] WARN: Disk space is low, only 10GB left.
3[2024-01-01 10:10:00] ERROR: Database connection failed.
4[2024-01-01 10:15:00] INFO: User "John" logged in.
5[2024-01-01 10:20:00] DEBUG: Query executed: SELECT * FROM users;
6[2024-01-01 10:25:00] INFO: Service "WebServer" started.
7[2024-01-01 10:30:00] WARN: High CPU usage detected, 90%.
8[2024-01-01 10:35:00] ERROR: File not found: /var/www/html/index.html.
9[2024-01-01 10:40:00] INFO: User "Alice" logged out.
10[2024-01-01 10:45:00] DEBUG: Memory allocation: 512MB.
11

#RS指定输入时换行符
[ldx@VM-20-5-opencloudos ~]$ awk -F ":" '{print NR $1}' test.txt 
1root
2bin
3daemon
4adm
5lp
6sync
7shutdown
8halt
9mail
10operator
11games

[ldx@VM-20-5-opencloudos ~]$ awk -F ":" -v RS=":" '{print NR $1}' test.txt 
1root
2x
30
40
5Super User
6/root
7/bin/bash
bin
8x
91
101
11bin
12/bin
13/usr/sbin/nologin
daemon
14x
152
162
17daemon
18/sbin
19/usr/sbin/nologin
adm
20x
213
224
23adm
24/var/adm
25/usr/sbin/nologin
lp
26x
274
287
29lp
30/var/spool/lpd
31/usr/sbin/nologin
sync
32x
335
340
35sync
36/sbin
37/bin/sync
shutdown
38x
396
400
41shutdown
42/sbin
43/sbin/shutdown
halt
44x
457
460
47halt
48/sbin
49/sbin/halt
mail
50x
518
5212
53mail
54/var/spool/mail
55/usr/sbin/nologin
operator
56x
5711
580
59operator
60/root
61/usr/sbin/nologin
games
62x
6312
64100
65games
66/usr/games
67/usr/sbin/nologin

[ldx@VM-20-5-opencloudos ~]$ 

#ORS代替换行符
[ldx@VM-20-5-opencloudos ~]$ awk -F ":" -v ORS="------" '{print NR $1}' test.txt 
1root------2bin------3daemon------4adm------5lp------6sync------7shutdown------8halt------9mail------10operator------11games------[ldx@VM-20-5-opencloudos ~]$ 

#FILENAME
[ldx@VM-20-5-opencloudos ~]$ awk -F ":" '{print FILENAME,$1}' test.txt 
test.txt root
test.txt bin
test.txt daemon
test.txt adm
test.txt lp
test.txt sync
test.txt shutdown
test.txt halt
test.txt mail
test.txt operator
test.txt games

#ARGV.  0代表 awk 本身,1 代表文件名
[ldx@VM-20-5-opencloudos ~]$ awk -F ":" '{print ARGV[0],ARGV[1],ARGV[2]}' test.txt 
awk test.txt 
awk test.txt 
awk test.txt 
awk test.txt 
awk test.txt 
awk test.txt 
awk test.txt 
awk test.txt 
awk test.txt 
awk test.txt 
awk test.txt 

[ldx@VM-20-5-opencloudos ~]$ awk -F ":" '{print ARGV[0],ARGV[1],ARGV[2]}' test.txt system_log.txt 
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt
awk test.txt system_log.txt

#自定义变量
[ldx@VM-20-5-opencloudos ~]$ awk -v myname="刘霸天" 'BEGIN{print"我的名字是?"}'
我的名字是?
[ldx@VM-20-5-opencloudos ~]$ awk -v myname="刘霸天" 'BEGIN{print"我的名字是?" myname}'
我的名字是?刘霸天


awk 模式

在 awk 中,模式(Pattern)用于筛选出符合特定条件的行,然后对这些行执行相应的动作(Action)。awk 支持多种类型的模式

空模式
特点:不指定任何条件,对输入的每一行都会执行对应的动作。
示例:打印输入文件的每一行。
[ldx@VM-20-5-opencloudos ~]$ awk '{print $0}' test.txt 
root:x:0:0:Super User:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/sbin/nologin
daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/usr/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:/usr/sbin/nologin
operator:x:11:0:operator:/root:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/usr/sbin/nologin



正则表达式模式
特点:使用正则表达式来匹配行,通过 ~ (匹配)和 !~ (不匹配)操作符结合正则表达式进行筛选。
查找包含字母 a 的行
[ldx@VM-20-5-opencloudos ~]$ cat input.txt 
apple
banana
cherry
date
[ldx@VM-20-5-opencloudos ~]$ awk '$0 ~ /a/' input.txt 
apple
banana
date

查找不包含字母 a 的行
[ldx@VM-20-5-opencloudos ~]$ awk '$0 !~ /a/' input.txt 
cherry


关系表达式模式

特点:基于字段的值进行比较,使用比较运算符(如 ==、!=、>、<、>=、<=)来筛选行。
示例:假设有一个文件 scores.txt,内容为学生的姓名和成绩,格式为 “姓名 成绩”:
筛选出成绩大于 80 分的学生信息:
[ldx@VM-20-5-opencloudos ~]$ cat scores.txt 
Alice 85
Bob 70
Charlie 90
David 65

[ldx@VM-20-5-opencloudos ~]$ awk '$2>80 {print $0}' scores.txt
Alice 85
Charlie 90



范围模式

特点:指定一个开始模式和一个结束模式,匹配从开始模式到结束模式之间的所有行(包含开始和结束行),使用逗号分隔两个模式。

匹配从 “Start of log” 到 “End of log” 之间的所有行:
[ldx@VM-20-5-opencloudos ~]$ cat log.txt 
Start of log
Line 1
Line 2
End of log
Another line

[ldx@VM-20-5-opencloudos ~]$ awk '/Start of log/,/End of log/' log.txt 
Start of log
Line 1
Line 2
End of log


BEGIN 和 END 模式

特点:
BEGIN 模式在处理输入文件的第一行之前执行,通常用于初始化变量、设置输出格式等。
END 模式在处理完输入文件的最后一行之后执行,通常用于输出汇总信息、关闭文件等。
示例:统计 scores.txt 文件中所有学生的成绩总和:
[ldx@VM-20-5-opencloudos ~]$ cat scores.txt 
Alice 85
Bob 70
Charlie 90
David 65

[ldx@VM-20-5-opencloudos ~]$ awk 'BEGIN {sum = 0} {sum += $2} END {print "Total score:", sum}' scores.txt
Total score: 310
#在 BEGIN 块中初始化 sum 变量为 0,在主体部分逐行累加成绩,最后在 END 块中输出成绩总和。

 组合模式

特点:可以使用逻辑运算符(&& 逻辑与、|| 逻辑或、! 逻辑非)将多个模式组合起来,实现更复杂的筛选条件。
示例:在 scores.txt 文件中筛选出成绩大于 70 且小于 90 分的学生信息:
[ldx@VM-20-5-opencloudos ~]$ cat scores.txt 
Alice 85
Bob 70
Charlie 90
David 65

[ldx@VM-20-5-opencloudos ~]$ awk '$2>70 && $2<90 {print $0}' scores.txt 
Alice 85


格式化输出

image.png

[ldx@VM-20-5-opencloudos ~]$ cat data.txt 
John 25
Alice 30
Bob 22

[ldx@VM-20-5-opencloudos ~]$ awk '{print $1, $2}' data.txt
John 25
Alice 30
Bob 22
#在这个例子中,print 语句输出了每行的第一个字段和第二个字段,字段之间用空格分隔,每行末尾有换行符。

image.png

[ldx@VM-20-5-opencloudos ~]$ cat data.txt 
John 25
Alice 30
Bob 22

[ldx@VM-20-5-opencloudos ~]$ awk '{printf "Name: %s, Age: %d\n", $1, $2}' data.txt
Name: John, Age: 25
Name: Alice, Age: 30
Name: Bob, Age: 22
#在这个例子中,printf 语句按照指定的格式输出了姓名和年龄,并且在每行末尾添加了换行符。


[ldx@VM-20-5-opencloudos ~]$ cat test.txt 
root:x:0:0:Super User:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/sbin/nologin
daemon:x:2:2:daemon:/sbin:/usr/sbin/nologin
adm:x:3:4:adm:/var/adm:/usr/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/usr/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:/usr/sbin/nologin
operator:x:11:0:operator:/root:/usr/sbin/nologin
games:x:12:100:games:/usr/games:/usr/sbin/nologin

[ldx@VM-20-5-opencloudos ~]$ awk -F ":" 'BEGIN{printf "%-15s\t %-15s\t %-15s\t %-15s\t %-15s\t %-15s\t %-15s\n","用户名","密码","UID","GID","用户注释","用户家目录","用户使用的解释器"}{printf "%-15s\t %-15s\t %-15s\t %-15s\t %-15s\t %-15s\t %-15s\n",$1,$2,$3,$4,$5,$6,$7}' test.txt 
用户名            	 密码             	 UID            	 GID            	 用户注释           	 用户家目录          	 用户使用的解释器       
root           	 x              	 0              	 0              	 Super User     	 /root          	 /bin/bash      
bin            	 x              	 1              	 1              	 bin            	 /bin           	 /usr/sbin/nologin
daemon         	 x              	 2              	 2              	 daemon         	 /sbin          	 /usr/sbin/nologin
adm            	 x              	 3              	 4              	 adm            	 /var/adm       	 /usr/sbin/nologin
lp             	 x              	 4              	 7              	 lp             	 /var/spool/lpd 	 /usr/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	 /usr/sbin/nologin
operator       	 x              	 11             	 0              	 operator       	 /root          	 /usr/sbin/nologin
games          	 x              	 12             	 100            	 games          	 /usr/games     	 /usr/sbin/nologin
[ldx@VM-20-5-opencloudos ~]$ 

两者对比总结
输出格式控制:print 语句的输出格式比较简单,主要由 OFS 控制;而 printf 语句可以通过格式化字符串实现更复杂的输出格式控制。
换行符处理:print 会自动在输出内容末尾添加换行符;printf 不会自动添加换行符,需要在格式化字符串中显式指定。
使用场景:如果只需要简单地输出数据,print 语句更加方便快捷;如果需要对输出格式进行精细控制,如对齐、指定小数位数等,应该使用 printf 语句。
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码