39 awk 命令(一)

awk是一種編程語言,用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行處理。數(shù)據(jù)可以來自標(biāo)準(zhǔn)輸入(stdin)、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數(shù)和動態(tài)正則表達(dá)式等先進(jìn)功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更多是作為腳本來使用。awk有很多內(nèi)建的功能,比如數(shù)組、函數(shù)等,這是它和C語言的相同之處,靈活性是awk最大的優(yōu)勢。

awk 基本結(jié)構(gòu)

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file

一個awk腳本通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊3部分組成,這三個部分是可選的。任意一個部分都可以不出現(xiàn)在腳本中,腳本通常是被單引號或雙引號中,例如:

awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename 

awk 的工作原理

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'
  • 第一步:執(zhí)行BEGIN{ commands }語句塊中的語句;
  • 第二步:從文件或標(biāo)準(zhǔn)輸入(stdin)讀取一行,然后執(zhí)行pattern{ commands }語句塊,它逐行掃描文件,從第一行到最后一行重復(fù)這個過程,直到文件全部被讀取完畢。
  • 第三步:當(dāng)讀至輸入流末尾時,執(zhí)行END{ commands }語句塊。

BEGIN語句塊在awk開始從輸入流中讀取行之前被執(zhí)行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中。

END語句塊在awk從輸入流中讀取完所有的行之后即被執(zhí)行,比如打印所有行的分析結(jié)果這類信息匯總都是在END語句塊中完成,它也是一個可選語句塊。

Pattern語句塊中的通用命令是最重要的部分,它也是可選的。如果沒有提供pattern語句塊,則默認(rèn)執(zhí)行{ print },即打印每一個讀取到的行,awk讀取的每一行都會執(zhí)行該語句塊。

root@ubuntu:~# cat cats.txt | awk 'BEGIN{ print "Start" } { print } END{ print "End" }'
Start
This is my cat
  my cat's name is betty
This is my dog
  my dog's name is frank
This is my fish
  my fish's name is george
This is my goat
  my goat's name is adam
End

當(dāng)使用不帶參數(shù)的print時,它就打印當(dāng)前行,當(dāng)print的參數(shù)是以逗號進(jìn)行分隔時,打印時則以空格作為定界符。在awk的print語句塊中雙引號是被當(dāng)作拼接符使用,例如:

root@ubuntu:~# echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' 
v1 v2 v3

雙引號拼接使用

root@ubuntu:~# echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'
v1=v2=v3

awk 內(nèi)置變量

說明:[A][N][P][G]表示第一個支持變量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk

 $n 當(dāng)前記錄的第n個字段,比如n為1表示第一個字段,n為2表示第二個字段。
 $0 這個變量包含執(zhí)行過程中當(dāng)前行的文本內(nèi)容。
 [N] ARGC 命令行參數(shù)的數(shù)目。 
 [G] ARGIND 命令行中當(dāng)前文件的位置(從0開始算)。
 [N] ARGV 包含命令行參數(shù)的數(shù)組。
 [G] CONVFMT 數(shù)字轉(zhuǎn)換格式(默認(rèn)值為%.6g)。   
 [P] ENVIRON 環(huán)境變量關(guān)聯(lián)數(shù)組。 
 [N] ERRNO 最后一個系統(tǒng)錯誤的描述。 
 [G] FIELDWIDTHS 字段寬度列表(用空格鍵分隔)。 
 [A] FILENAME 當(dāng)前輸入文件的名。 
 [P] FNR 同NR,但相對于當(dāng)前文件。 
 [A] FS 字段分隔符(默認(rèn)是任何空格)。 
 [G] IGNORECASE 如果為真,則進(jìn)行忽略大小寫的匹配。 
 [A] NF 表示字段數(shù),在執(zhí)行過程中對應(yīng)于當(dāng)前的字段數(shù)。 
 [A] NR 表示記錄數(shù),在執(zhí)行過程中對應(yīng)于當(dāng)前的行號。 
 [A] OFMT 數(shù)字的輸出格式(默認(rèn)值是%.6g)。 
 [A] OFS 輸出字段分隔符(默認(rèn)值是一個空格)。 
 [A] ORS 輸出記錄分隔符(默認(rèn)值是一個換行符)。  
 [A] RS 記錄分隔符(默認(rèn)是一個換行符)。 
 [N] RSTART 由match函數(shù)所匹配的字符串的第一個位置。 
 [N] RLENGTH 由match函數(shù)所匹配的字符串的長度。 
 [N] SUBSEP 數(shù)組下標(biāo)分隔符(默認(rèn)值是34)。

例子:

root@ubuntu:~# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}'
Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5
Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7

使用print $NF可以打印出一行中的最后一個字段,使用$(NF-1)則是打印倒數(shù)第二個字段,其他以此類推:

root@ubuntu:~# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print $NF}'
f3
f5
f7
root@ubuntu:~# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print $NF}'
f3
f5
f7
root@ubuntu:~# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print $NF-1}'
-1
-1
-1
root@ubuntu:~# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print $(NF-1)}'
f2
f4
f6
root@ubuntu:~# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print $NF"-1"}'
f3-1
f5-1
f7-1
root@ubuntu:~# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print $NF,-1}'
f3 -1
f5 -1
f7 -1

統(tǒng)計文中的行數(shù)

root@ubuntu:~# awk 'END{ print NR }' cats.txt 
8

文本中各行數(shù)字相加

root@ubuntu:~# seq 5 | awk 'BEGIN{ sum=0; print "總和:" } { print $1"+"; sum+=$1 } END{ print "等于"; print sum }'
總和:
1+
2+
3+
4+
5+
等于
15

awk 使用外部變量

root@ubuntu:~# var1="aaa"
root@ubuntu:~# var2="bbb"
root@ubuntu:~# echo | awk '{print v1,v2}' v1=$var1 v2=$var2
aaa bbb
root@ubuntu:~# awk '{print v1,v2}' v1=$var1 v2=$var2 cats.txt 
aaa bbb
aaa bbb
aaa bbb
aaa bbb
aaa bbb
aaa bbb
aaa bbb
aaa bbb
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載 原文的排版和內(nèi)容都更加友好,并且詳細(xì),我只是在這里貼出了一部分留作自己以后參考和學(xué)習(xí),如希望更詳細(xì)了解AWK...
    XKirk閱讀 3,244評論 2 25
  • 本章主要學(xué)習(xí)內(nèi)容awk介紹 ?awk基本用法 ?awk變量 ?awk格式化 ?awk操作符 ?awk條件判斷 ?a...
    楠人幫閱讀 1,282評論 0 8
  • awk介紹awk變量printf命令:實現(xiàn)格式化輸出操作符awk patternawk actionawk數(shù)組aw...
    哈嘍別樣閱讀 1,582評論 0 4
  • awk:報告生成器,格式化文本輸出 內(nèi)容: awk介紹 awk基本用法 awk變量 awk格式化 awk操作符 a...
    BossHuang閱讀 1,468評論 0 9
  • awk: grep,sed,awk grep:文本過濾 sed:文本編輯 awk:文本格式化工具; 1 什么是aw...
    木林森閱讀 1,802評論 0 16