學習awk的時候,感覺awk和很多語言都有相似的地方,比如awk和LEX都是對輸入串採用“模式{動作}”的方式進行相應的解析。但是不同的是,awk中有兩個特殊的模式,一個是BEGIN,其只在開始的時候,執行一次,其他的時候不匹配,一般可以將初始化的工作交給它,有點類似於建構函式;另一個是END,其只在結束的時候執行一次,其可以用於輸出統計的結果。
awk中預設的變數是$0,代表輸入的整行語句,比如/mark/{action},就相當於$0~/mark/{ation},這點和perl中的$_變數的作用很像,能提高程式編寫的效率,但是同時也增加了維護的難度。
awk的操作符和C語言的操作符非常的類似。
awk內建了一些處理函數,比如說取某個字串,替換某個串等。
awk中間有很多內建變數,對這些變數執行相應的讀寫操作能得到對應的結果。
一、編寫一個指令碼,熟悉下面列出的內建變數:
ARGC 命令列參數個數
ARGV 命令列參數數組
FILENAME string=當前輸入的檔案名稱
FNR 在當前檔案中目前記錄數(對輸入檔案起始為1)
FS 輸入欄位分隔符號
NF 目前記錄的欄位數
NR 目前記錄數(為全部輸入檔案)
OFMT 數值的輸出格式(預設為%.6g)
OFS 輸出欄位的分隔字元(預設為空白格)
ORS 輸出記錄分隔字元(預設為分行符號)
RS 輸入記錄分隔字元(預設為分行符號)
執行指令碼:
awk -f awk_inline_variable testfile.txt
註:testfile.txt內容見下文所述
執行結果:
二、一些小練習:
cat /etc/passwd
1、查看系統上有哪些使用者
awk -F ":" '{print $1}' /etc/passwd
執行結果:
最開始的時候,寫成列印print $0,結果總是列印出全部的檔案,後來查資料才知道,分割後的字串續寫是從1開始的。
2、查看系統上的使用者名稱和使用者UID
awk -F ":" '{print "Username:" $1 "\t\tUID:"$3}' /etc/passwd
執行結果(部分結果):
3、格式化輸出字元
做完上面的練習後,發現UID一欄並沒有對齊,於是尋找資料,發現awk中也有printf函數,這樣就和C語言中的一樣了,接著格式化輸出一次上面的內容,username靠左對齊,UID靠右對齊。
awk -F ":" '{printf("Username:%-20s UID:%10d\n",$1,$3)}' /etc/passwd
執行結果(部分結果):
三、然後在網上找了道練習題:
檔案名稱:testdata.txt
Mike Harrington:[510] 548-1278:250:100:175
Christian Dobbins:[408] 538-2358:155:90:201
Susan Dalsass:[206] 654-6279:250:60:50
Archie McNichol:[206] 548-1348:250:100:175
Jody Savage:[206] 548-1278:15:188:150
Guy Quigley:[916] 343-6410:250:100:175
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
John Goldenrod:[916] 348-4278:250:100:175
Chet Main:[510] 548-5258:50:95:135
Tom Savage:[408] 926-3456:250:168:200
Elizabeth Stachelin:[916] 440-1763:175:75:300
上面的資料庫中包含名電話號碼和過去三個月裡的捐款
1、顯示電話號碼
awk -F ":" '{print $2}' testfile.txt
2、顯示Dan的電話號碼
awk -F ":" '/Dan/{print $2}' testfile.txt
3、顯示Susan的名字和電話號碼
awk -F ":" '/Susan/{print $1 $2}' testfile.txt
4、顯示以D開始的姓
awk -F "[: ]" '$2~/^D/{print $2}' testfile.txt
5、顯示以一個C或E的名
awk -F " " '/^[CE]/{print $1}' testfile.txt
6、顯示只有四個字元的名
awk -F " " 'length($1) == 4{print $1}' testfile.txt
7、顯示區號916的人名
awk -F ":" '/\[916\]/{print $1}' testfile.txt
8、顯示Mike的捐款,顯示每個值時都有.250$100$175
awk -F ":" 'BEGIN{OFS="$"} /Mike/{print $3,$4,$5}' testfile.txt
9、顯示人名其後跟一個逗號如Jody,Savage
awk -F "[: ]" '{print $1","$2}' testfile.txt
10、寫一個awk的腳它的作用:
.顯示Savage的全名和電話號碼
.顯示Chet的捐款
.顯示頭一個月捐款$250的人
awk -f awk_test testfile.txt