awk 是 Linux 一個很重要的文字和報告處理工具,可以處理複雜的文字,從中摘取所需資料,生成資料包告,可以稱為 awk 程式設計。其名稱來自於三個創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。
語法
第一種形式
awk 'BEGIN{} pattern {commands} END{}' obj_file
BEGIN 表示在正式處理文字前就要執行的指令,相應的 END 則表示處理完文字後需要執行的指令。中間部分表示對文字的處理,如果無需遍歷整個文字而對特定行進行處理需要用到 pattern , commands 表示對經過 pattern 處理後匹配到的行再執行 commands 命令。如果不寫 pattern 表示對每一行都進行處理。
第二種形式
對標準輸出進行處理,跟 gerp 和 sed 類似。
std output | awk 'BEGIN{} pattern {commands} END{}'
內建變數
內建變數是 awk 預定義好的,內建在 awk 的變數。
$0
表示輸出一整行,如果沒有 pattern 作為限制,將輸出若有內容。
awk '{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
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
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pengbo:x:1000:1000:Peng Bo:/home/pengbo:/bin/bash
saslauth:x:998:76:Saslauthd user:/run/saslauthd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
nginx:x:1001:1001::/home/nginx:/bin/bash
bob:x:1002:1002::/home/bob:/bin/bash
$1-$n 與 FS
awk 欄位預設分隔符為空格或者 tab 。trump.txt 檔案內容如下
Donald trump accused of calling US war dead 'suckers and losers'.
Donald TRUMP accused of calling US war dead 'suckers and losers'.
Trump has a big mouth.
執行
awk '{print $1}' trump.txt
Donald
Donald
Trump
etc/passwd
每行內容以 : 作為分隔,如果需要輸出第 7 個欄位的 shell ,需要先指定分隔符 FS
,如下
awk BEGIN'{FS=":"}{print $7}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/bash
/sbin/nologin
/bin/false
/bin/bash
/bin/bash
NF
顯示每行的欄位數,示例如下
awk '{print NF}' trump.txt
輸出
11
11
5
NR
顯示每行的行號,示例如下
awk '{print NR}' trump.txt /etc/passwd
輸出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FNR
多檔案處理時,每個行號單獨計算,從 1 開始,示例如下
awk '{print FNR}' trump.txt /etc/passwd
輸出
1
2
3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
RS
表示輸入行分隔符,預設為回車,如果打算將其設定為 * ,示例如下
cat RS.txt
abcde*fghij*klmno
awk 'BEGIN{RS="*"}{print $0}' RS.txt
abcde
fghij
klmno
本作品採用《CC 協議》,轉載必須註明作者和本文連結