文章最后更新时间:2025年02月03日
前言
常见内置变量: $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 变量
#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
格式化输出
[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 语句输出了每行的第一个字段和第二个字段,字段之间用空格分隔,每行末尾有换行符。
[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 语句。
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。