awk從放棄到入門(1):awk基礎(chǔ) (通俗易懂缤沦,快進(jìn)來看)

我們先來用專業(yè)的術(shù)語描述一下awk是什么虎韵,如果你看不懂,沒關(guān)系缸废,我們會(huì)再用"大白話"解釋一遍包蓝。


awk是一個(gè)報(bào)告生成器,它擁有強(qiáng)大的文本格式化的能力企量,這就是專業(yè)的說法测萎。

你可能不理解所謂的報(bào)告生成器中的"報(bào)告"是什么,你可以把"報(bào)告"理解為"報(bào)表"或者"表格",也就是說届巩,我們可以利用awk命令绳泉,將一些文本整理成我們想要的樣子,比如把一些文本整理成"表"的樣子姆泻,然后再展示出來零酪,剛才概念中提到的"文本格式化的能力",也就是這個(gè)意思拇勃,其實(shí)這樣說可能還是不太容易理解四苇,不用著急,當(dāng)你看到后面的"示例"時(shí)方咆,自然會(huì)明白awk所擅長(zhǎng)的"文本格式化"能力是什么月腋。


awk是由Alfred Aho 、Peter Weinberger 和 Brian Kernighan這三個(gè)人創(chuàng)造的瓣赂,awk由這個(gè)三個(gè)人的姓氏的首個(gè)字母組成榆骚。

awk早期是在unix上實(shí)現(xiàn)的,所以煌集,我們現(xiàn)在在linux的所使用的awk其實(shí)是gawk妓肢,也就是GNU awk,簡(jiǎn)稱為gawk苫纤,awk還有一個(gè)版本碉钠,New awk,簡(jiǎn)稱為nawk卷拘,但是linux中最常用的還是gawk喊废。

awk其實(shí)是一門編程語言,它支持條件判斷栗弟、數(shù)組污筷、循環(huán)等功能。所以乍赫,我們也可以把a(bǔ)wk理解成一個(gè)腳本語言解釋器瓣蛀。


grep 斤寂、sed、awk被稱為linux中的"三劍客"揪惦。

我們總結(jié)一下這三個(gè)"劍客"的特長(zhǎng)。

grep 更適合單純的查找或匹配文本

sed ?更適合編輯匹配到的文本

awk ?更適合格式化文本罗侯,對(duì)文本進(jìn)行較復(fù)雜格式處理


此處器腋,我們只總結(jié) awk

awk基礎(chǔ)

awk基本語法如下,看不懂沒關(guān)系钩杰,我們會(huì)慢慢舉例纫塌。

awk [options] 'program' file1 , file2 , ```

對(duì)于上述語法中的program來說,又可以細(xì)分成pattern和action讲弄,也就是說措左,awk的基本語法如下

awk [options] 'Pattern{Action}' file


從字面上理解 ,action指的就是動(dòng)作避除,awk擅長(zhǎng)文本格式化怎披,并且將格式化以后的文本輸出,所以awk最常用的動(dòng)作就是print和printf瓶摆,因?yàn)閍wk要把格式化完成后的文本輸出啊凉逛,所以,這兩個(gè)動(dòng)作最常用群井。


我們先從最簡(jiǎn)單用法開始了解awk状飞,我們先不使用[options] ,也不指定pattern,直接使用最簡(jiǎn)單的action书斜,從而開始認(rèn)識(shí)awk诬辈,示例如下

上圖中,我們只是使用awk執(zhí)行了一個(gè)打印的動(dòng)作荐吉,將testd文件中的內(nèi)容打印了出來焙糟。


好了,現(xiàn)在样屠,我們來操作一下另一個(gè)類似的場(chǎng)景酬荞。

上圖中的示例沒有使用到options和pattern,上圖中的awk '{print $5}'瞧哟,表示輸出df的信息的第5列混巧,$5表示將當(dāng)前行按照分隔符分割后的第5列,不指定分隔符時(shí)勤揩,默認(rèn)使用空格作為分隔符咧党,細(xì)心的你一定發(fā)現(xiàn)了,上述信息用的空格不止有一個(gè)陨亡,而是有連續(xù)多個(gè)空格傍衡,awk自動(dòng)將連續(xù)的空格理解為一個(gè)分割符了深员,是不是比cut命令要簡(jiǎn)單很多,這樣比較簡(jiǎn)單的例子蛙埂,有利于我們開始了解awk倦畅。


awk是逐行處理的,逐行處理的意思就是說绣的,當(dāng)awk處理一個(gè)文本時(shí)叠赐,會(huì)一行一行進(jìn)行處理,處理完當(dāng)前行屡江,再處理下一行芭概,awk默認(rèn)以"換行符"為標(biāo)記,識(shí)別每一行惩嘉,也就是說罢洲,awk跟我們?nèi)祟愐粯樱看斡龅?回車換行"文黎,就認(rèn)為是當(dāng)前行的結(jié)束惹苗,新的一行的開始,awk會(huì)按照用戶指定的分割符去分割當(dāng)前行耸峭,如果沒有指定分割符鸽粉,默認(rèn)使用空格作為分隔符。

$0 表示顯示整行 抓艳,$NF表示當(dāng)前行分割后的最后一列($0和$NF均為內(nèi)置變量)

注意触机,$NF 和 NF 要表達(dá)的意思是不一樣的,對(duì)于awk來說玷或,$NF表示最后一個(gè)字段儡首,NF表示當(dāng)前行被分隔符切開以后,一共有幾個(gè)字段偏友。

也就是說蔬胯,假如一行文本被空格分成了7段,那么NF的值就是7位他,$NF的值就是$7, ?而$7表示當(dāng)前行的第7個(gè)字段氛濒,也就是最后一列,那么每行的倒數(shù)第二列可以寫為$(NF-1)鹅髓。

我們也可以一次輸出多列舞竿,使用逗號(hào)隔開要輸出的多個(gè)列,如下窿冯,一次性輸出第一列和第二列

同理骗奖,也可以一次性輸出多個(gè)指定的列,如下圖

我們發(fā)現(xiàn),第一行并沒有第5列执桌,所以并沒有輸出任何文本鄙皇,而第二行有第五列,所以輸出了仰挣。

除了輸出文本中的列伴逸,我們還能夠添加自己的字段,將自己的字段與文件中的列結(jié)合起來膘壶,如下做法错蝴,都是可以的。

從上述實(shí)驗(yàn)中可以看出香椎,awk可以靈活的將我們指定的字符與每一列進(jìn)行拼接,或者把指定的字符當(dāng)做一個(gè)新列插入到原來的列中禽篱,也就是awk格式化文本能力的體現(xiàn)畜伐。


但是要注意,$1這種內(nèi)置變量的外側(cè)不能加入雙引號(hào)躺率,否則$1會(huì)被當(dāng)做文本輸出玛界,示例如下

我們也可以輸出整行,比如悼吱,如下兩種寫法都表示輸出整行慎框。

我們說過,awk的語法如下

awk [options] 'Pattern{Action}' file

而且我們說過awk是逐行處理的后添, 剛才已經(jīng)說過了最常用的Action:print

現(xiàn)在笨枯,我們來認(rèn)識(shí)下一Pattern,也就是我們所說的模式

不過遇西,我們準(zhǔn)備先把a(bǔ)wk中最特殊的模式展示給大家馅精,以后再介紹普通的模式,因?yàn)槠胀J叫枰钠容^長(zhǎng)粱檀,所以我們先來總結(jié)特殊模式洲敢。

AWK 包含兩種特殊的模式:BEGIN?和?END。

BEGIN?模式指定了處理文本之前需要執(zhí)行的操作:

END?模式指定了處理完所有行之后所需要執(zhí)行的操作:

什么意思呢茄蚯?光說不練不容易理解压彭,我們來看一些小例子,先從BEGIN模式開始渗常,示例如下

上述寫法表示壮不,在開始處理test文件中的文本之前,先執(zhí)行打印動(dòng)作皱碘,輸出的內(nèi)容為"aaa","bbb".

也就是說忆畅,上述示例中,雖然指定了test文件作為輸入源,但是在開始處理test文本之前家凯,需要先執(zhí)行BEGIN模式指定的"打印"操作

既然還沒有開始逐行處理test文件中的文本缓醋,那么是不是根本就不需要指定test文件呢,我們來試試绊诲。

經(jīng)過實(shí)驗(yàn)發(fā)現(xiàn)送粱,還真是,我們并沒有給定任何輸入來源掂之,awk就直接輸出信息了抗俄,因?yàn)椋珺EGIN模式表示世舰,在處理指定的文本之前动雹,需要先執(zhí)行BEGIN模式中指定的動(dòng)作,而上述示例沒有給定任何輸入源跟压,但是awk還是會(huì)先執(zhí)行BEGIN模式指定的"打印"動(dòng)作胰蝠,打印完成后,發(fā)現(xiàn)并沒有文本可以處理震蒋,于是就只完成了"打印 aaa bbb"的操作茸塞。

這個(gè)時(shí)候,如果我們想要awk先執(zhí)行BEGIN模式指定的動(dòng)作查剖,再根據(jù)執(zhí)我們自定義的動(dòng)作去操作文本钾虐,該怎么辦呢?示例如下

上圖中笋庄,藍(lán)色標(biāo)注的部分表示BEGIN模式指定的動(dòng)作效扫,這部分動(dòng)作需要在處理指定的文本之前執(zhí)行,所以直砂,上圖中先打印出了"aaa bbb"荡短,當(dāng)BEGIN模式對(duì)應(yīng)的動(dòng)作完成后,在使用后面的動(dòng)作處理對(duì)應(yīng)的文本哆键,即打印test文件中的第一列與第二列掘托,這樣解釋應(yīng)該比較清楚了吧。

看完上述示例籍嘹,似乎更加容易理解BEGIN模式是什么意思了闪盔,BEGIN模式的作用就是,在開始逐行處理文本之前辱士,先執(zhí)行BEGIN模式所指定的動(dòng)作泪掀。以此類推,END模式的作用就一目了然了颂碘,舉例如下异赫。

聰明如你一定明白了,END模式就是在處理完所有的指定的文本之后,需要指定的動(dòng)作塔拳。

那么鼠证,我們可以結(jié)合BEGIN模式和END模式一起使用。示例如下

上述示例中返回的結(jié)果有沒有很像一張"報(bào)表"靠抑,有"表頭" ?量九、"表內(nèi)容"、 ?"表尾"颂碧,awk對(duì)文本的格式化能力你體會(huì)到了嗎荠列?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市载城,隨后出現(xiàn)的幾起案子肌似,更是在濱河造成了極大的恐慌,老刑警劉巖诉瓦,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件川队,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡垦搬,警方通過查閱死者的電腦和手機(jī)呼寸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門艳汽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猴贰,“玉大人,你說我怎么就攤上這事河狐∶兹疲” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵馋艺,是天一觀的道長(zhǎng)栅干。 經(jīng)常有香客問我,道長(zhǎng)捐祠,這世上最難降的妖魔是什么碱鳞? 我笑而不...
    開封第一講書人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮踱蛀,結(jié)果婚禮上窿给,老公的妹妹穿的比我還像新娘。我一直安慰自己率拒,他們只是感情好崩泡,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猬膨,像睡著了一般角撞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評(píng)論 1 314
  • 那天谒所,我揣著相機(jī)與錄音热康,去河邊找鬼。 笑死百炬,一個(gè)胖子當(dāng)著我的面吹牛褐隆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剖踊,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼庶弃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了德澈?” 一聲冷哼從身側(cè)響起歇攻,我...
    開封第一講書人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梆造,沒想到半個(gè)月后缴守,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镇辉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年屡穗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忽肛。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡村砂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屹逛,到底是詐尸還是另有隱情础废,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布罕模,位于F島的核電站评腺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏淑掌。R本人自食惡果不足惜蒿讥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抛腕。 院中可真熱鬧芋绸,春花似錦、人聲如沸兽埃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柄错。三九已至舷夺,卻和暖如春苦酱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背给猾。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來泰國(guó)打工疫萤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敢伸。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓扯饶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親池颈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尾序,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

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

  • 轉(zhuǎn)載 原文的排版和內(nèi)容都更加友好,并且詳細(xì),我只是在這里貼出了一部分留作自己以后參考和學(xué)習(xí),如希望更詳細(xì)了解AWK...
    XKirk閱讀 3,224評(píng)論 2 25
  • awk介紹awk變量printf命令:實(shí)現(xiàn)格式化輸出操作符awk patternawk actionawk數(shù)組aw...
    哈嘍別樣閱讀 1,571評(píng)論 0 4
  • awk:報(bào)告生成器,格式化文本輸出 內(nèi)容: awk介紹 awk基本用法 awk變量 awk格式化 awk操作符 a...
    BossHuang閱讀 1,458評(píng)論 0 9
  • Linux指令中文說明傳送入口 整理自Linux指令中文說明 文本和數(shù)據(jù)進(jìn)行處理的編程語言awk 是一種編程語言躯砰,...
    釋閑人閱讀 2,133評(píng)論 1 6
  • 本章主要學(xué)習(xí)內(nèi)容awk介紹 ?awk基本用法 ?awk變量 ?awk格式化 ?awk操作符 ?awk條件判斷 ?a...
    楠人幫閱讀 1,273評(píng)論 0 8