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...表明相應列)ios
[root@1 awk]# awk -F ':' '{print $1}' test.txt root bin daemon daemon Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c …… 能夠一次打印多列: [root@1 awk]# awk -F ':' '{print $1,$2,$3}' test.txt |head -3 root x 0 bin x 1 daemon x 2 能夠指定打印各列內容時的分隔符號: [root@1 awk]# awk -F ':' '{print $1"#"$2"#"$3}' test.txt |head -3 root#x#0 bin#x#1 daemon#x#2
說明: 指定分隔符後該命令只識別指定的分隔符,若是某行無指定的分隔符則會打印其整行!正則表達式
打印含有「oo」的全部行: [root@1 awk]# awk '/oo/' test.txt root:x:0:0:roprot:/root:/bin/bash Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 打印第一段含有「oo」的行: [root@1 awk]# awk -F ':' '$1 ~ /oo/' test.txt 注:‘~’表示匹配! 打印第一段中含有「oo」的行 root:x:0:0:roprot:/root:/bin/bash Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c 支持正則表達式: [root@1 awk]# awk -F ':' '$1 ~ /o+/' test.txt root:x:0:0:roprot:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c [root@1 awk]# awk -F ':' '$1 ~ /oo+/' test.txt root:x:0:0:roprot:/root:/bin/bash Ctrl-Alt-Deoooleoooote ios handled by /usr/lib/systemd/system/c 支持多個表達式同時執行: [root@1 awk]# awk -F ':' '/root/ {print $1,$3} /daemon/ {print $1,$3,$4}' test.txt root 0 daemon 2 2 daemon 2 2 即:打印各行中帶有root或daemon的第一、三、4段內容。也能夠寫成「 awk -F ':' '/root|daemon/ {print $1,$3,$4}' test.txt」
當'$3>=1000 {print $1}'時: [root@1 awk]# awk -F ':' '$3>=1000 {print $1}' test.txt user001 當'$3>="1000" {print $1}'時: [root@1 awk]# awk -F ':' '$3>="1000" {print $1}' test.txt |head -3 daemon adm lp 匹配字符串: [root@1 awk]# awk -F ':' '$7!="/sbin/nologin" ' 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 user001:x:1000:1000::/home/user001:/bin/bash 「!=」表示不等於
說明: 當「1000」加引號時會被當作是字符串,以ASC碼(二進制)的方式進行計算處理,不加引號的時候會被當作是數值處理。編程
[root@1 awk]# head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"' root:x:0:0:root:/root:/bin/bash root:x:1:1:bin:/bin:/sbin/nologin root:x:2:2:daemon:/sbin:/sbin/nologin [root@1 awk]# awk -F ':' '$3=="0" {print $1}' test.txt root
說明: 當使用一個「=」等號時表示爲等號前面字符賦值,使用兩個「==」表示邏輯關係(進行判斷)。數組
[root@1 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@1 awk]# awk -F ':' '$3==$4' test.txt |head -3 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@1 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
說明: 「&&」表示而且。bash
[root@1 awk]# awk -F ':' '$3>1000 || $7!="/sbin/nologin"' 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 user001:x:1000:1000::/home/user001:/bin/bash [root@1 awk]# awk -F ':' '$3>1000 || $7~/bash/' test.txt root:x:0:0:root:/root:/bin/bash user001:x:1000:1000::/home/user001:/bin/bash
說明: 「||」表示或者。編程語言
語法1: [root@1 awk]# awk -F ':' '{OFS="#"} $3>1000 || $7~/bash/ {print $1,$3,$7}' test.txt root#0#/bin/bash user001#1000#/bin/bash 語法2: [root@1 awk]# awk -F ':' '{OFS="#"} {if ($3>1000 || $7~/bash/) {print $1,$3,$7}}' test.txt root#0#/bin/bash user001#1000#/bin/bash
[root@1 awk]# awk -F ':' '$3<5 && $7!="/sbin/nologin" {print NR":"$1}' test.txt 1:root [root@1 awk]# awk -F ':' '$3<5 && $3>2 && $7=="/sbin/nologin" {print NR":"$1}' test.txt 4:adm 5:lp 打印前三行: [root@1 awk]# awk -F ':' 'NR<=3' 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 [root@1 awk]# awk -F ':' 'NR<=3 && $1~/root/' test.txt root:x:0:0:root:/root:/bin/bash
注: 相似於grep -n。函數
[root@1 awk]# awk -F ':' '$3<5 && $3>2 && $7=="/sbin/nologin" {print NF":"$1}' test.txt 7:adm 7:lp
[root@1 awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt 5657