>awk是一種編程語言,用於在linux/unix下對文本和數據進行處理。數據能夠來自標準輸入(stdin)、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更可能是做爲腳原本使用。awk有不少內建的功能,好比數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優點。linux
awk ‘{print $n}’ [filename] 在此n表明數字(當n=0時$0表明文件全部內容,當n=1,2,3...時$1,2,3...表明相應列)正則表達式
awk -F 指定分隔符(默認以空格爲分隔符)編程
[root@cham2 awk]# awk -F ':' '{print $1}' test.txt root bin daemon adm lp sync shutdown halt mail operator games ftp nobody systemd-bus-proxy systemd-network dbus polkitd tss postfix sshd chrony 能夠一次打印多列 [root@cham2 awk]# awk -F ':' '{print $1,$2,$3}' test.txt root x 0 bin x 1 daemon x 2 adm x 3 lp x 4 sync x 5 shutdown x 6 halt x 7 mail x 8 operator x 11 games x 12 ftp x 14 nobody x 99 systemd-bus-proxy x 999 systemd-network x 192 dbus x 81 polkitd x 998 tss x 59 postfix x 89 sshd x 74 chrony x 997 [root@cham2 awk]# awk -F ':' '{print $1"#"$2"#"$3}' test.txt | head -3 root#x#0 bin#x#1 daemon#x#2 [root@cham2 awk]# awk -F ':' '{print $1"#"$2"#"$3}' test.txt root#x#0 bin#x#1 daemon#x#2 adm#x#3 lp#x#4 sync#x#5 shutdown#x#6 halt#x#7 mail#x#8 operator#x#11 games#x#12 ftp#x#14 nobody#x#99 systemd-bus-proxy#x#999 systemd-network#x#192 dbus#x#81 polkitd#x#998 tss#x#59 postfix#x#89 sshd#x#74 chrony#x#997 打印全部的段用$0表示 (至關於cat命令) [root@cham2 awk]# awk -F ':' '{print $0}' test.txt 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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:998:996:User for polkitd:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:997:995::/var/lib/chrony:/sbin/nologin
說明: 指定分隔符後該命令只識別指定的分隔符,若是某行無指定的分隔符則會打印其整行!c#
awk的匹配功能(匹配用「~」)數組
打印含有「oo」的全部行: [root@cham2 awk]# awk '/oo/' test.txt root:x:0:0:root:/root:/bin/bash lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin 匹配第一段帶有oo的 注:‘ ~ ’表示匹配! [root@cham2 awk]# awk -F ':' '$1 ~ /oo/' test.txt root:x:0:0:root:/root:/bin/bash 一樣支持正則表達式 [root@cham2 awk]# awk -F ':' '$1 ~ /o+/' test.txt root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown operator:x:11:0:operator:/root:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin polkitd:x:998:996:User for polkitd:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:997:995::/var/lib/chrony:/sbin/nologin [root@cham2 awk]# awk -F ':' '$1 ~ /oo+/' test.txt root:x:0:0:root:/root:/bin/bash 支持多個表達式同時執行: [root@cham2 awk]# awk -F ':' '/root/ {print $1,$3} /user/ {print $1, $3,$4}' test.txt root 0 operator 11 tss 59 59 user1 1000 1000 user2 1001 1001 user3 1002 1002 user4 1003 1003 user5 1004 1004 user6 1005 1005 [root@cham2 awk]# grep -E 'root|user' test.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin user1:x:1000:1000::/home/user1:/bin/bash user2:x:1001:1001::/home/user2:/bin/bash user3:x:1002:1002::/home/user3:/bin/bash user4:x:1003:1003::/home/user4:/bin/bash user5:x:1004:1004::/home/user5:/bin/bash user6:x:1005:1005::/home/user6:/bin/bash
數值比較bash
[root@cham2 awk]# awk -F ':' '$3==0' test.txt root:x:0:0:root:/root:/bin/bash [root@cham2 awk]# awk -F ':' '$3==0 {print $1}' test.txt root [root@cham2 awk]# awk -F ':' '$3>=1000 {print $1}' test.txt user1 user2 user3 user4 user5 user6 當'$3>=1000 {print $1}'時: [root@cham2 awk]# awk -F ':' '$3>=1000 {print $0}' test.txt user1:x:1000:1000::/home/user1:/bin/bash user2:x:1001:1001::/home/user2:/bin/bash user3:x:1002:1002::/home/user3:/bin/bash user4:x:1003:1003::/home/user4:/bin/bash user5:x:1004:1004::/home/user5:/bin/bash user6:x:1005:1005::/home/user6:/bin/bash 當'$3>="1000" {print $1}' 並打印第一段 時: [root@cham2 awk]# awk -F ':' '$3>="1000" {print $1}' test.txt daemon adm lp sync shutdown halt mail operator games ftp nobody systemd-bus-proxy systemd-network dbus polkitd tss postfix sshd chrony user1 user2 user3 user4 user5 user6 當'$3>="1000" {print $1}' 時: [root@cham2 awk]# awk -F ':' '$3>="1000" {print $0}' test.txt 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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:998:996:User for polkitd:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:997:995::/var/lib/chrony:/sbin/nologin user1:x:1000:1000::/home/user1:/bin/bash user2:x:1001:1001::/home/user2:/bin/bash user3:x:1002:1002::/home/user3:/bin/bash user4:x:1003:1003::/home/user4:/bin/bash user5:x:1004:1004::/home/user5:/bin/bash user6:x:1005:1005::/home/user6:/bin/bash 匹配字符串: [root@cham2 awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt user1:x:1000:1000::/home/user1:/bin/bash user2:x:1001:1001::/home/user2:/bin/bash user3:x:1002:1002::/home/user3:/bin/bash user4:x:1003:1003::/home/user4:/bin/bash user5:x:1004:1004::/home/user5:/bin/bash user6:x:1005:1005::/home/user6:/bin/bash
說明: 當「1000」加引號時會被當作是字符串,以ASC碼(二進制)的方式進行計算處理,不加引號的時候會被當作是數值處理。ssh
[root@cham2 awk]# head -n 3 test.txt |awk -F ':' '$1="root"' root 0 0 root /root /bin/bash root x 1 1 bin /bin /sbin/nologin root x 2 2 daemon /sbin /sbin/nologin [root@cham2 awk]# head -n 3 test.txt |awk -F ':' '{OFS=":"} $1="root"' root:0:0:root:/root:/bin/bash root:x:1:1:bin:/bin:/sbin/nologin root:x:2:2:daemon:/sbin:/sbin/nologin
說明: 當使用一個「=」等號時表示爲等號前面字符賦值,使用兩個「==」表示邏輯關係(進行判斷)。編程語言
字符比較大小函數
[root@cham2 awk]# awk -F ':' '$3<$4' test.txt 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 games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@cham2 awk]# awk -F ':' '$3==$4' test.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin user1:x:1000:1000::/home/user1:/bin/bash user2:x:1001:1001::/home/user2:/bin/bash user3:x:1002:1002::/home/user3:/bin/bash user4:x:1003:1003::/home/user4:/bin/bash user5:x:1004:1004::/home/user5:/bin/bash user6:x:1005:1005::/home/user6:/bin/bash 說明: 「&&」表示而且。 [root@cham2 awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
說明: 「&&」表示而且。工具
[root@cham2 awk]# awk -F ':' '$3>1000 || $7=="/sbin/nologin"' test.txt 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 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 nobody:x:99:99:Nobody:/:/sbin/nologin systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:998:996:User for polkitd:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin chrony:x:997:995::/var/lib/chrony:/sbin/nologin user2:x:1001:1001::/home/user2:/bin/bash user3:x:1002:1002::/home/user3:/bin/bash user4:x:1003:1003::/home/user4:/bin/bash user5:x:1004:1004::/home/user5:/bin/bash user6:x:1005:1005::/home/user6:/bin/bash [root@cham2 awk]# awk -F ':' '$3>1000 || $7 ~ /bash/' test.txt root:x:0:0:root:/root:/bin/bash user1:x:1000:1000::/home/user1:/bin/bash user2:x:1001:1001::/home/user2:/bin/bash user3:x:1002:1002::/home/user3:/bin/bash user4:x:1003:1003::/home/user4:/bin/bash user5:x:1004:1004::/home/user5:/bin/bash user6:x:1005:1005::/home/user6:/bin/bash
說明: 「||」表示或者。
語法1 [root@cham2 awk]# awk -F ':' '{OFS="#"} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}' test.txt root#0#/bin/bash user1#1000#/bin/bash user2#1001#/bin/bash user3#1002#/bin/bash user4#1003#/bin/bash user5#1004#/bin/bash user6#1005#/bin/bash 不寫條件語法1 [root@cham2 awk]# awk -F ':' '{OFS="#"} {print $1,$3,$7}' test.txt root#0#/bin/bash bin#1#/sbin/nologin daemon#2#/sbin/nologin adm#3#/sbin/nologin lp#4#/sbin/nologin sync#5#/bin/sync shutdown#6#/sbin/shutdown halt#7#/sbin/halt mail#8#/sbin/nologin operator#11#/sbin/nologin games#12#/sbin/nologin ftp#14#/sbin/nologin nobody#99#/sbin/nologin systemd-bus-proxy#999#/sbin/nologin systemd-network#192#/sbin/nologin dbus#81#/sbin/nologin polkitd#998#/sbin/nologin tss#59#/sbin/nologin postfix#89#/sbin/nologin sshd#74#/sbin/nologin chrony#997#/sbin/nologin user1#1000#/bin/bash user2#1001#/bin/bash user3#1002#/bin/bash user4#1003#/bin/bash user5#1004#/bin/bash user6#1005#/bin/bash [root@cham2 awk]# 語法2 [root@cham2 awk]# awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' test.txt user2#x#1001#1001 user3#x#1002#1002 user4#x#1003#1003 user5#x#1004#1004 user6#x#1005#1005
NR (=number row)表示(行)號 | NF (=number fragment)表示段數(列)
相似於grep -n [root@cham2 awk]# awk -F ':' '{print NR":"$0}' test.txt 1:root:x:0:0:root:/root:/bin/bash 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:adm:x:3:4:adm:/var/adm:/sbin/nologin 5:lp:x:4:7:lp:/var/spool/lpd:/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:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin 11:games:x:12:100:games:/usr/games:/sbin/nologin 12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13:nobody:x:99:99:Nobody:/:/sbin/nologin 14:systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin 15:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 16:dbus:x:81:81:System message bus:/:/sbin/nologin 17:polkitd:x:998:996:User for polkitd:/:/sbin/nologin 18:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 19:postfix:x:89:89::/var/spool/postfix:/sbin/nologin 20:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 21:chrony:x:997:995::/var/lib/chrony:/sbin/nologin 22:user1:x:1000:1000::/home/user1:/bin/bash 23:user2:x:1001:1001::/home/user2:/bin/bash 24:user3:x:1002:1002::/home/user3:/bin/bash 25:user4:x:1003:1003::/home/user4:/bin/bash 26:user5:x:1004:1004::/home/user5:/bin/bash 27:user6:x:1005:1005::/home/user6:/bin/bash [root@cham2 awk]# awk -F ':' '{print NF":"$0}' test.txt 7:root:x:0:0:root:/root:/bin/bash 7:bin:x:1:1:bin:/bin:/sbin/nologin 7:daemon:x:2:2:daemon:/sbin:/sbin/nologin 7:adm:x:3:4:adm:/var/adm:/sbin/nologin 7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7:sync:x:5:0:sync:/sbin:/bin/sync 7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 7:halt:x:7:0:halt:/sbin:/sbin/halt 7:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 7:operator:x:11:0:operator:/root:/sbin/nologin 7:games:x:12:100:games:/usr/games:/sbin/nologin 7:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 7:nobody:x:99:99:Nobody:/:/sbin/nologin 7:systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin 7:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 7:dbus:x:81:81:System message bus:/:/sbin/nologin 7:polkitd:x:998:996:User for polkitd:/:/sbin/nologin 7:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 7:postfix:x:89:89::/var/spool/postfix:/sbin/nologin 7:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 7:chrony:x:997:995::/var/lib/chrony:/sbin/nologin 7:user1:x:1000:1000::/home/user1:/bin/bash 7:user2:x:1001:1001::/home/user2:/bin/bash 7:user3:x:1002:1002::/home/user3:/bin/bash 7:user4:x:1003:1003::/home/user4:/bin/bash 7:user5:x:1004:1004::/home/user5:/bin/bash 7:user6:x:1005:1005::/home/user6:/bin/bash 打印前10行 [root@cham2 awk]# awk -F ':' 'NR<=10' test.txt rootx: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 [root@cham2 awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt rootx:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync
求和
[root@cham2 awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt 9676