2021-05-12 14:32:11
Linux高階文字處理之gawk內建變數
一、FS –輸入欄位分隔符
FS是awk內建變數,用來制定行分隔符,功能能-F一樣,區別在於FS只能用在BEGIN語句塊當中,命令格式如下:
BEGIN{FS="SEPARATOR"}
範例1:
[root@localhost ~]# awk 'BEGIN { FS=","; print "---------------------------nNametTitlen------------------------"} {print $2,"t",$3;} END {print "-----------------------------------------"}' emp --------------------------- Name Title ------------------------ John Doe CEO Jason Smith IT Manager Raj Reddy Sysadmin Anand Ram Developer Jane Miller Sales Manager -----------------------------------------
注意:預設的欄位分隔符不僅僅是單個空格字元,它實際上是一個或多個空白字元。
當遇到一個包含多個欄位分隔符的檔案時,你可以使用正規表示式來指定多個欄位分隔符,如 FS = "[,:%]" 指定欄位分隔符可以是逗號 ,或者分號 : 或者百分號 % 。
範例2:
[root@localhost ~]# cat emp1 101,John Doe:CEO%10000 102,Jason Smith:IT Manager%5000 103,Raj Reddy:Sysadmin%4500 104,Anand Ram:Developer%4500 105,Jane Miller:Sales Manager%3000 [root@localhost ~]# awk 'BEGIN{FS="[,:%]"}{print $2,"t",$3}' emp1 #使用正規表示式匹配 John Doe CEO Jason Smith IT Manager Raj Reddy Sysadmin Anand Ram Developer Jane Miller Sales Manager
二、OFS – 輸出欄位分隔符
FS 是輸入欄位分隔符,OFS 是輸出欄位分隔符。OFS 會被列印在輸出行的連續的欄位之間。 預設情況下,awk 在輸出欄位中間以空格分開。
範例1:
[root@localhost ~]# awk 'BEGIN{FS=",";OFS=":"}{print $2,$3}' emp John Doe:CEO Jason Smith:IT Manager Raj Reddy:Sysadmin Anand Ram:Developer Jane Miller:Sales Manager
注意與下面情況區分,如下情況會多輸出空格字元:
[root@localhost ~]# awk -F, '{print $2,":",$3}' emp John Doe : CEO Jason Smith : IT Manager Raj Reddy : Sysadmin Anand Ram : Developer Jane Miller : Sales Manager
範例3:使用逗號與不使用逗號的區別
[root@localhost ~]# awk 'BEGIN{print "text1","text2"}' #使用逗號預設使用OFS text1 text2 [root@localhost ~]# awk 'BEGIN{print "text1""text2"}' #不使用逗號預設不使用OFS text1text2
三、RS – 記錄分隔符
Awk 預設的記錄分隔符是換行符。
範例1:將檔案emp2內容作為 5 行記錄來處理(而不是單獨的一行), 並且列印每條記錄中雇員的姓名
[root@localhost ~]# cat emp2 101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane, Miller [root@localhost ~]# awk -F, 'BEGIN{RS=":"}{print $2}' emp2 #將冒號結尾當做一行處理 John Doe Jason Smith Raj Reddy Anand Ram Jane
範例2:列印emp3檔案中雇員名稱和職位
[root@localhost ~]# cat emp3 101 John Doe CEO - 102 Jason Smith IT Manager - 103 Raj Reddy Sysadmin - 104 Anand Ram Developer - 105 Jane Miller Sales Manager [root@localhost ~]# awk 'BEGIN{RS="-n";FS="n"}{print $2,$3}' emp3 John Doe CEO Jason Smith IT Manager Raj Reddy Sysadmin Anand Ram Developer Jane Miller Sales Manager
四、ORS – 輸出記錄分隔符
ORS 是輸出欄位分隔符,預設輸出欄位分隔符為換行。
範例1:在每個輸出行後面追加"---------"
[root@localhost ~]# cat emp 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager [root@localhost ~]# awk 'BEGIN{FS=",";ORS="n---------n"}{print $2,$3}' emp John Doe CEO --------- Jason Smith IT Manager --------- Raj Reddy Sysadmin --------- Anand Ram Developer --------- Jane Miller Sales Manager ---------
範例2:把每個欄位列印成單獨一行,每條記錄用”---“分隔
[root@localhost ~]# awk 'BEGIN{FS=",";OFS="n";ORS="n---n"}{print $1,$2,$3}' emp 101 John Doe CEO --- 102 Jason Smith IT Manager --- 103 Raj Reddy Sysadmin --- 104 Anand Ram Developer --- 105 Jane Miller Sales Manager ---
五、NR – 記錄序號
NR 非常有用,在迴圈內部標識記錄序號。用於 END 區域時,代表輸入檔案的總記錄數。確切的叫法是"記錄的序號"(Number of the Record)”,也就是當前記錄在所有記錄中的行號。
注意:NR 會在多個檔案中持續增加,當處理到第二個檔案時, NR 不會被重置為 1,而是在前一個檔案的 NR 基礎上繼續增加。
範例1:多檔案列印行號
1
|
[root@localhost ~] # awk '{print NR,$1}' emp emp1 1 101,John 2 102,Jason 3 103,Raj 4 104,Anand 5 105,Jane 6 101,John 7 102,Jason 8 103,Raj 9 104,Anand 10 105,Jane |
範例2:
[root@localhost ~]# awk 'BEGIN{FS=","} > {print "Emp id of record number",NR,"is",$1;} > END{print "Total number of records:",NR}' emp Emp id of record number 1 is 101 Emp id of record number 2 is 102 Emp id of record number 3 is 103 Emp id of record number 4 is 104 Emp id of record number 5 is 105 Total number of records: 5
範例3:BEGIN中的NR值為0
[root@localhost ~]# awk 'BEGIN{print NR}{print $1}' emp emp1 0 101,John 102,Jason 103,Raj 104,Anand 105,Jane 101,John 102,Jason 103,Raj 104,Anand 105,Jane
六、FILENAME – 當前處理的檔名
當使用 awk 處理多個輸入檔案時, FILENAME 就顯得很有用,它代表 awk 當前正在處理的文 件。
範例1:
[root@localhost ~]# cat emp 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager [root@localhost ~]# cat emp2 101,John Doe:102,Jason Smith:103,Raj Reddy:104,Anand Ram:105,Jane, Miller [root@localhost ~]# awk '{print FILENAME,$1}' emp emp2 emp 101,John emp 102,Jason emp 103,Raj emp 104,Anand emp 105,Jane emp2 101,John
如果 awk 從標準輸入獲取內容, FILENAME 的值將會是"-"。
範例二:從標準輸入獲取內容
[root@localhost ~]# awk '{print "Last name",$2;print "Filename:",FILENAME}' John Deo Last name Deo Filename: -
管道一樣:
[root@localhost ~]# echo "John Doe"|awk '{print "Last name:",$2;print "Filename:",FILENAME}'Last name: Doe Filename: -
注意:在 BEGIN 區域內, FILENAME 的值是空,因為 BEGIN 區域只針對 awk 本身,而不處理任何檔案。
[root@localhost ~]# echo "John Doe"|awk ' >BEGIN{print FILENAME} >{print "Last name:",$2;print "Filename:",FILENAME} >END{print FILENAME}' Last name: Doe Filename: - -
七、FNR – 檔案中的 NR
awk處理多檔案時FNR與NR不同的地方在於,NR連續計數,處理完第一個檔案後第二個檔案的NR數不會置零,FNR會置零重新計算。
範例1:同時列印 NR 和 FNR
[root@localhost ~]# awk '{print FILENAME,"NR is",NR";""FNR is",FNR}' emp emp2 emp NR is 1;FNR is 1 #emp檔案5行,emp2檔案1行 emp NR is 2;FNR is 2 emp NR is 3;FNR is 3 emp NR is 4;FNR is 4 emp NR is 5;FNR is 5 emp2 NR is 6;FNR is 1
八、NF - 欄位數量
範例1:
[root@localhost ~]# head -1 /etc/passwd root:x:0:0:young,geek,010110110,0101101101:/root:/bin/bash [root@localhost ~]# head -1 /etc/passwd|awk -F: '{print NF}' 7
九、ARGC - 命令列引數的個數
ARGC表示命令列中awk命令後面跟的引數的個數,包含awk命令自身。
範例1:
[root@localhost ~]# awk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab 3 [root@localhost ~]# awk 'BEGIN {print ARGC}' /etc/fstab 2 [root@localhost ~]# awk 'BEGIN {print ARGC}'
十、ARGV - 命令列儲存引數內容
ARGV:陣列,儲存的是命令列所給定的各引數。
範例1:
[root@localhost ~]# awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/passwd #awk命令自身也包括 awk [root@localhost ~]# awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/passwd /etc/fstab [root@localhost ~]# awk 'BEGIN {print ARGV[2]}' /etc/fstab /etc/passwd /etc/passwd
十一、$NF - 最後欄位內容
$NF表示每行的最後一個欄位的內容
範例1:
[root@localhost ~]# head -1 /etc/passwd root:x:0:0:young,geek,010110110,0101101101:/root:/bin/bash root@localhost ~]# head -1 /etc/passwd|awk -F: '{print $NF}' /bin/bash [root@localhost ~]# head -1 /etc/passwd|awk -F: '{print $(NF-1)}' /root [root@localhost ~]# head -1 /etc/passwd|awk -F: '{print $(NF-2)}' young,geek,010110110,0101101101
十二、IGNORECASE - 忽略大小寫
預設情況下, IGNORECASE 的值是 0,所有 awk 區分大小寫。當把 IGNORECASE 的值設定為 1 時, awk 則不區分大小寫,這在使用正規表示式和比較字串時很有效率。
範例1:
[root@localhost ~]
# cat items.txt
101,HD Camcorder,Video,210,10
102,Refrigerator,Appliance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5
[root@localhost ~]
# cat ign.awk
BEGIN {
FS=
","
;
IGNORECASE=1;
} {
if
($3 ==
"video"
) print $0;
if
($2 ~
"TENNIS"
) print $0;
}
[root@localhost ~]
# awk -f ign.awk items.txt
101,HD Camcorder,Video,210,10
104,Tennis Racket,Sports,190,20
[root@localhost ~]
# awk 'BEGIN{IGNORECASE=1} /video/{print}' items.txt
101,HD Camcorder,Video,210,10
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-02/140317.htm
相關文章