awk 是強大的文字處理工具,堪稱程式設計語言。以下彙整 awk 內建變數與實戰用法。
| 變數 | 說明 |
|---|---|
| $0 | 目前記錄(作為單一變數) |
| $1~$n | 目前記錄第 n 個欄位,以 FS 分隔 |
| FS | 輸入欄位分隔符,預設空白 |
| NF | 目前記錄欄位數(列數) |
| NR | 已讀取記錄數(行號,從 1 開始) |
| RS | 輸入記錄分隔符,預設換行 |
| OFS | 輸出欄位分隔符,預設空白 |
| ORS | 輸出記錄分隔符,預設換行 |
| ARGC | 命令列參數個數 |
| ARGV | 命令列參數陣列 |
| FILENAME | 目前輸入檔案名稱 |
| IGNORECASE | 非零則忽略大小寫比對 |
| ARGIND | 目前處理檔案的 ARGV 索引 |
| CONVFMT | 數字轉換格式,預設 %.6g |
| ENVIRON | UNIX 環境變數關聯陣列 |
| ERRNO | 系統錯誤訊息 |
| FIELDWIDTHS | 固定寬度欄位分隔字串 |
| FNR | 目前檔案記錄數 |
| OFMT | 數字輸出格式,預設 %.6g |
| RSTART | match() 比對成功的起始位置 |
| RLENGTH | match() 比對字串長度 |
| SUBSEP | 多維陣列下標分隔符,預設 \034 |
[chengmo@localhost ~]$ awk '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
/^root/ 為選擇表示式,$0 代表整行。
$ awk 'BEGIN{FS=":"}/^root/{print $1,$NF}' /etc/passwd
root /bin/bash
/etc/passwd 以 : 分隔,故修改 FS。NF 為總欄位數,$NF 為最後一欄。
$ awk 'BEGIN{FS=":"}{print NR,$1,$NF}' /etc/passwd
1 root /bin/bash
2 bin /sbin/nologin
...
$ awk 'BEGIN{FS=":";OFS="^^"}/^root/{print FNR,$1,$NF}' /etc/passwd
1^^root^^/bin/bash
$ awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}' /etc/passwd
1 root /bin/bash^^2 bin /sbin/nologin^^3 daemon /sbin/nologin^^...
$ awk 'BEGIN{FS=":";print "ARGC="ARGC;for(k in ARGV) print k"="ARGV[k]}' /etc/passwd
ARGC=2
0=awk
1=/etc/passwd
$ awk 'BEGIN{FS=":";print FILENAME}{print FILENAME}' /etc/passwd
/etc/passwd
注意:FILENAME、$0-$N、NF 無法在 BEGIN 區塊使用。
$ awk 'BEGIN{print ENVIRON["PATH"]}' /etc/passwd
/usr/lib/qt-3.3/bin:/usr/kerberos/bin:...
$ awk 'BEGIN{OFMT="%.3f";print 2/3,123.11111111}' /etc/passwd
0.667 123.111
$ echo 20100117054932 | awk 'BEGIN{FIELDWIDTHS="4 2 2 2 2 3"}{print $1"-"$2"-"$3,$4":"$5":"$6}'
2010-01-17 05:49:32
格式為空白分隔的數字串,忽略 FS。
$ awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH}'
11 11 4
$ awk 'BEGIN{start=match("this is a test",/^[a-z]+$/); print start, RSTART, RLENGTH}'
0 0 -1
RSTART 為比對起始位置,RLENGTH 為長度,找不到為 -1。