Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux awk 內建變數完整速查表與實戰範例

編輯:Linux 教學

awk 是強大的文字處理工具,堪稱程式設計語言。以下彙整 awk 內建變數與實戰用法。

內建變數速查表

變數說明
$0目前記錄(作為單一變數)
$1~$n目前記錄第 n 個欄位,以 FS 分隔
FS輸入欄位分隔符,預設空白
NF目前記錄欄位數(列數)
NR已讀取記錄數(行號,從 1 開始)
RS輸入記錄分隔符,預設換行
OFS輸出欄位分隔符,預設空白
ORS輸出記錄分隔符,預設換行
ARGC命令列參數個數
ARGV命令列參數陣列
FILENAME目前輸入檔案名稱
IGNORECASE非零則忽略大小寫比對
ARGIND目前處理檔案的 ARGV 索引
CONVFMT數字轉換格式,預設 %.6g
ENVIRONUNIX 環境變數關聯陣列
ERRNO系統錯誤訊息
FIELDWIDTHS固定寬度欄位分隔字串
FNR目前檔案記錄數
OFMT數字輸出格式,預設 %.6g
RSTARTmatch() 比對成功的起始位置
RLENGTHmatch() 比對字串長度
SUBSEP多維陣列下標分隔符,預設 \034

實戰範例

1. 基本列印

[chengmo@localhost ~]$ awk '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

/^root/ 為選擇表示式,$0 代表整行。

2. 設定欄位分隔符 (FS)

$ awk 'BEGIN{FS=":"}/^root/{print $1,$NF}' /etc/passwd
root /bin/bash

/etc/passwd 以 : 分隔,故修改 FS。NF 為總欄位數,$NF 為最後一欄。

3. 記錄行號 (NR, FNR)

$ awk 'BEGIN{FS=":"}{print NR,$1,$NF}' /etc/passwd
1 root /bin/bash
2 bin /sbin/nologin
...

4. 設定輸出欄位分隔符 (OFS)

$ awk 'BEGIN{FS=":";OFS="^^"}/^root/{print FNR,$1,$NF}' /etc/passwd
1^^root^^/bin/bash

5. 設定輸出記錄分隔符 (ORS)

$ awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}' /etc/passwd
1 root /bin/bash^^2 bin /sbin/nologin^^3 daemon /sbin/nologin^^...

6. 取得命令列參數 (ARGC, ARGV)

$ awk 'BEGIN{FS=":";print "ARGC="ARGC;for(k in ARGV) print k"="ARGV[k]}' /etc/passwd
ARGC=2
0=awk
1=/etc/passwd

7. 取得輸入檔名 (FILENAME)

$ awk 'BEGIN{FS=":";print FILENAME}{print FILENAME}' /etc/passwd
/etc/passwd

注意:FILENAME、$0-$N、NF 無法在 BEGIN 區塊使用。

8. 取得環境變數 (ENVIRON)

$ awk 'BEGIN{print ENVIRON["PATH"]}' /etc/passwd
/usr/lib/qt-3.3/bin:/usr/kerberos/bin:... 

9. 設定數字輸出格式 (OFMT)

$ awk 'BEGIN{OFMT="%.3f";print 2/3,123.11111111}' /etc/passwd
0.667 123.111

10. 固定寬度分隔 (FIELDWIDTHS)

$ 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。

11. RSTART 與 RLENGTH

$ 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。

Copyright © Windows教程網 All Rights Reserved