linux三劍客---awk

1、介紹

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

2、語法

awk [options] 'script' var=value?file(s)

awk [options] -f scriptfile var=value file(s)

-F?fs ??fs指定輸入分隔符,fs可以是字符串或正則表達式,如-F:

-v?var=value ??賦值一個用戶定義變量,將外部變量傳遞給awk

-f?scripfile ?從腳本文件中讀取awk命令

-m[fr]?val ??對val值設置內在限制,-mf選項限制分配給val的最大塊數目;-mr選項限制記錄的最大數目

2、awk工作原理

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

第一步:執行BEGIN{ commands }語句塊中的語句;

第二步:從文件或標準輸入(stdin)讀取一行,然后執行pattern{ commands }語句塊,它逐行掃描文件,從第一行到最后一行重復這個過程,直到文件全部被讀取完畢。

第三步:當讀至輸入流末尾時,執行END{ commands }語句塊。

3、使用

echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'

v1=v2=v3

cat a.js

1

2

3

awk 'BEGIN{print "start"} {a+=$1} END{print a}' b.js

start

6

4、內置變量

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

$n 當前記錄的第n個字段,比如n為1表示第一個字段,n為2表示第二個字段。

$0 這個變量包含執行過程中當前行的文本內容。

[N] ARGC 命令行參數的數目。

[G] ARGIND 命令行中當前文件的位置(從0開始算)。

[N] ARGV 包含命令行參數的數組。

[G] CONVFMT 數字轉換格式(默認值為%.6g)。

[P] ENVIRON 環境變量關聯數組。

[N] ERRNO 最后一個系統錯誤的描述。

[G] FIELDWIDTHS 字段寬度列表(用空格鍵分隔)。

[A] FILENAME 當前輸入文件的名。

[P] FNR 同NR,但相對于當前文件。

[A] FS 字段分隔符(默認是任何空格)。

[G] IGNORECASE 如果為真,則進行忽略大小寫的匹配。

[A] NF 表示字段數,在執行過程中對應于當前的字段數。

[A] NR 表示記錄數,在執行過程中對應于當前的行號。

[A] OFMT 數字的輸出格式(默認值是%.6g)。

[A] OFS 輸出字段分隔符(默認值是一個空格)。

[A] ORS 輸出記錄分隔符(默認值是一個換行符)。

[A] RS 記錄分隔符(默認是一個換行符)。

[N] RSTART 由match函數所匹配的字符串的第一個位置。

[N] RLENGTH 由match函數所匹配的字符串的長度。

[N] SUBSEP 數組下標分隔符(默認值是34)。

1)每行的最后一個值

echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $NF}'

f3

f5

echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $(NF-1)}'

f2

f4

2)每行的列數

echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print NF}'

3

3

3)傳遞參數

VAR=10000

echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'

5、運算和判斷


運算符

awk 'BEGIN{a="b";print a++,++a;}'

0 2

awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}'

1

注意:所有用作算術運算符進行操作,操作數自動轉為數值,所有非數值都變為0

awk 'BEGIN{

????test=100;

????if(test>90){

????????print "very good";

????} else if(test>60){

????????print "good";

????} else{

????????print "no pass";

????}

}'

very good

awk 'BEGIN{

for(k in ENVIRON){

print k"="ENVIRON[k];

}

}'

TERM=linuxG_BROKEN_FILENAMES=1SHLVL=1

pwd=/root/text...

logname=root

HOME=/root

SSH_CLIENT=192.168.1.21 53087 22

6、高級輸入

cat a.js

a

b

c

d

e

awk 'NR%2==1{next}{print NR,$0;}' a.js

2 b

4 d

cat a.js:

web01[192.168.2.100]

httpd ok

tomcat ok

sendmail ok

web02[192.168.2.101]

httpd ok

postfix ok

web03[192.168.2.102]

mysqld ok

httpd ok

awk '/^web/{T=$0;next;}{print T":\t"$0;}' a.js

web01[192.168.2.100]: httpd okweb01[192.168.2.100]: tomcat okweb01[192.168.2.100]: sendmail okweb02[192.168.2.101]: httpd okweb02[192.168.2.101]: postfix okweb03[192.168.2.102]: mysqld okweb03[192.168.2.102]: httpd ok

執行shell的date命令,并通過管道輸出給getline,然后getline從管道中讀取并將輸入賦值給out,split函數把變量out轉化成數組mon,然后打印數組mon的第二個元素

awk 'BEGIN{ "date" | getline out; split(out,mon); print mon[1] }' test

2018年

awk 'BEGIN{info="it is a test";split(info,tA," ");for(k in tA){print k,tA[k];}}'

2 is

3 a

4 test

1 it

awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}'0.841 22026.466 2.303 3


支持的函數


字符串函數


時間函數
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容