awk學習劄記

來源:互聯網
上載者:User

  學習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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.