awk命令實戰(zhàn)使用

我們知道 Linux 三劍客改基,它們是 grep魂奥、sed童社、awk溯警。在前邊已經(jīng)講過 grepsed盖淡,沒看過的同學(xué)可以直接點擊閱讀塞琼,今天要分享的是更為強大的 awk

sed 可以實現(xiàn)非交互式的字符串替換禁舷,grep 能夠?qū)崿F(xiàn)有效的過濾功能彪杉。與兩者相比,awk 是一款強大的文本分析工具牵咙,在對數(shù)據(jù)分析并生成報告時派近,顯得尤為強悍。

awk 強大的功能洁桌,是一般 Linux 命令無法比擬的渴丸。在本文中,我不會告訴你 awk 也是一種編程語言另凌,免得會嚇到你谱轨。我們只需把它當(dāng)做 Linux 下一款強大的文本分析工具即可。

這篇文章吠谢,我仍然秉持著 實用土童、實踐 原則,提供大量的示例工坊,但不會面面俱到献汗。通過本文可以幫助你敢订,快速將 awk 運用起來,這些東西足夠應(yīng)付工作中大多數(shù)應(yīng)用場景罢吃。

場景

學(xué)習(xí)具體使用前楚午,先來看下 awk 能干些什么事情:

1. 能夠?qū)⒔o定的文本內(nèi)容,按照我們期望的格式輸出顯示尿招,打印成報表矾柜。

2. 分析處理系統(tǒng)日志,快速地分析挖掘我們關(guān)心的數(shù)據(jù)就谜,并生成統(tǒng)計信息把沼;

3. 方便地用來統(tǒng)計數(shù)據(jù)形帮,比如網(wǎng)站的訪問量鼠证,訪問的 IP 量等陌兑;

4. 通過各種工具的組合,快速地匯總分析系統(tǒng)的運行信息篮奄,讓你對系統(tǒng)的運行了如指掌;

5. 強大的腳本語言表達(dá)能力割去,支持循環(huán)窟却、條件、數(shù)組等語法呻逆,助你分析更加復(fù)雜的數(shù)據(jù)夸赫;

......

當(dāng)然 awk 不僅能做這些事情,當(dāng)你將它的用法融匯貫通時咖城,可以隨心所欲的按照你的意愿茬腿,來進(jìn)行高效的數(shù)據(jù)分析和統(tǒng)計。

不過我們需要知道宜雀,awk 不是萬能的切平,它比較擅長處理格式化的文本,比如 日志辐董、csv 格式數(shù)據(jù)等悴品;

原理

我們先來簡單了解 awk 基本工作原理,通過下邊的圖文講述简烘,希望你能了解 awk 到底是如何工作的苔严。

awk 基本命令格式

圖片

結(jié)合下圖來詳細(xì)說明 awk 工作原理

圖片
  • 首先,執(zhí)行關(guān)鍵字 BEGIN 標(biāo)識的 {} 中的命令孤澎;

  • 完成 BEGIN 大括號中命令的后届氢,開始執(zhí)行 body 命令;

  • 逐行讀取數(shù)據(jù)覆旭,默認(rèn)讀到 \n 分割的內(nèi)容為一條 記錄悼沈,其實就是的概念贱迟;

  • 記錄按照指定的分隔符劃分為 字段,其實就是的概念絮供;

  • 循環(huán)執(zhí)行 body 塊中的命令衣吠,每讀取一行,執(zhí)行一次 body壤靶,最終完成 body 執(zhí)行缚俏;

  • 最后,執(zhí)行 END 命令贮乳,通常會在 END 中輸出最后的結(jié)果忧换;

awk 是輸入驅(qū)動的,有多少輸入行向拆,就會執(zhí)行多少次 body 命令亚茬。

我們在下邊的示例學(xué)習(xí)中,要時刻記著:記錄 (Record) 就是浓恳,字段 (Field) 就是刹缝,BEGIN 是預(yù)處理階段,body 是 awk 真正工作的階段颈将,END 是最后處理階段梢夯。

實戰(zhàn) - 入門

從下邊內(nèi)容開始,我們直接進(jìn)入到實戰(zhàn)晴圾。為了方便舉例颂砸,我先把如下信息保存到 file.txt

圖片

好了,我們先來一個最簡單最常用的 awk 示例死姚,輸出第 1人乓、4、8 列:

圖片

大括號里邊的就是 awk 語句都毒,只能被單引號包含撒蟀,其中,$1..$N表示第幾列温鸽,$0 表示整個行內(nèi)容

再來看下 awk 比較實用的功能 格式化輸出保屯。和 C 語言的 printf 格式輸出是一毛一樣,我個人特別喜歡這種格式化方式涤垫,而不是 C++ 中的流的方式姑尺。

圖片

%s 表示字符串占位符,-4表示列寬度為 4蝠猬,且左對齊切蟋,我們還可以根據(jù)需要,列出更復(fù)雜的格式來榆芦,這里先不詳細(xì)舉例了柄粹。

實戰(zhàn) - 進(jìn)階

(一)過濾記錄

有些數(shù)據(jù)可能不是你想要的喘鸟,可以根據(jù)需要進(jìn)行過濾

圖片

上邊的過濾條件為,第 3 列為 root 且第 6 列為 10 的行驻右,才會被輸出什黑。

awk 支持各種比較運算符號 !=>堪夭、<愕把、>=<=森爽,其中 $0 表示整行的所有內(nèi)容恨豁。

(二)內(nèi)置變量

awk 內(nèi)置了一些變量,更方便我們對數(shù)據(jù)的處理

圖片

過濾第 3 列為 root 用戶爬迟,以及第 2 行內(nèi)容橘蜜,且打印時輸出行號。NR 表示當(dāng)前第幾行付呕,NF表示當(dāng)前行有幾列计福。

(三)指定分隔符

我們的數(shù)據(jù),不總是以空格為分隔符凡涩,我們可以通過 FS 變量指定分隔符。

圖片

我們指定分隔符為 2019疹蛉,這樣就將行內(nèi)容分割為了兩部分活箕,將 2019 替換成了 *

上邊的命令也可以通過 -F 選項指定分割符

圖片

如果你需要指定多個分隔符,可以這樣做 -F '[;:]'可款。相信聰明的你育韩,一定能夠理解并融會貫通的。

同樣闺鲸,awk 可以指定輸出時的分隔符筋讨,通過 OFS 變量來設(shè)置

圖片

輸出時,各字段用 OFS 指定的符號進(jìn)行了分隔摸恍。

實戰(zhàn) - 高級

(一)條件匹配

列出 root 用戶的所有文件悉罕,以及第一行文件

圖片

上邊匹配第三列中包含 root 的行,~ 其實就是正則表達(dá)式的匹配立镶。

同樣壁袄,awk 可以像 grep 一樣匹配某一行,就像這樣

圖片

另外媚媒,可以這樣 /Aug|Dec/ 匹配多個關(guān)鍵詞嗜逻。

模式取反可以使用 ! 符號

圖片

(二)拆分文件

我們來做一件有意思的事情,可以將文本信息拆分為多個文件缭召,下邊命令按照月份(第5列)將文件信息拆分為多個文件

圖片

awk 支持重定向符號 >栈顷,直接將每行內(nèi)容重定向到月份命名的文件了逆日,當(dāng)然你也可以把指定的列輸出到文件

(三)if 語句

復(fù)雜的條件判斷,可以使用 awk 的 if 語句萄凤,awk 的強大正因為它是個腳本解釋器室抽,擁有一般腳本語言的編程能力,下邊示例通過稍微復(fù)雜的條件進(jìn)行拆分文件

圖片

要注意蛙卤,if 語句是在大括號里邊的狠半。

(四)統(tǒng)計

統(tǒng)計當(dāng)前目錄下,所有 *.c颤难、*.h 文件所占用空間大小總和

圖片

第 5 列表示文件大小神年,每讀取一行就會將該文件大小計算到 sum 變量中,在最后 END階段打印出 sum行嗤,也就是所有文件的大小總和已日。

再來看一個例子,統(tǒng)計每個用戶的進(jìn)程占用了多少內(nèi)存栅屏,注意取值的是 RSS 那一列

圖片

這里用到了 數(shù)組for 循環(huán)飘千,值得一提的是,awk 的數(shù)組可以理解為字典或 Map栈雳,key 可以是數(shù)值和字符串护奈,這種數(shù)據(jù)類型在平時很常用。

(五)字符串

通過下邊簡單示例哥纫,展示 awk 對字符串操作的支持

圖片

awk 內(nèi)置支持一系列的字符串函數(shù)霉旗,length 計算字符串長度,toupper 函數(shù)轉(zhuǎn)換字符串為大寫蛀骇。

實戰(zhàn) - 技巧

為了從整體上理解 awk 工作機(jī)制厌秒,我們再來看一個綜合的示例,假設(shè)有一個學(xué)生成績單:

圖片

由于此示例程序稍顯復(fù)雜擅憔,在命令行上不易讀鸵闪,另外呢,也想通過此案例介紹另外一種 awk 的執(zhí)行方式暑诸,我們的 awk 腳本如下:

圖片

執(zhí)行 awk 結(jié)果如下

圖片

我們可以將復(fù)雜的 awk 語句寫入腳本文件 cal.awk蚌讼,然后通過 -f 選項指定從腳本文件執(zhí)行。

  • BEGIN 階段个榕,我們初始化了相關(guān)變量啦逆,并打印了表頭的格式

  • body 階段,我們讀取每一行數(shù)據(jù)笛洛,計算該學(xué)科和該同學(xué)的總成績

  • END 階段夏志,我們先打印了表尾的格式,并打印總成績,以及計算了平均值

這個簡單示例沟蔑,完整的體現(xiàn)了 awk 的工作機(jī)制和原理湿诊,希望通過此示例能夠幫你真正理解 awk 是如何工作的。

總結(jié)歸納

通過上述的示例瘦材,我們學(xué)習(xí)到了 awk 的工作原理厅须,下邊我們來總結(jié)下幾個概念和常用的知識點。

(一)內(nèi)置變量

1. 每一行內(nèi)容記錄食棕,叫做記錄朗和,英文名稱 Record

2. 每行中通過分隔符隔開的每一列,叫做字段簿晓,英文名稱 Field

明確這幾個概念后眶拉,我們來總結(jié)幾個重要的內(nèi)置變量:

  • NR:表示當(dāng)前的行數(shù);

  • NF:表示當(dāng)前的列數(shù)憔儿;

  • RS:行分隔符忆植,默認(rèn)是換行;

  • FS:列分隔符谒臼,默認(rèn)是空格和制表符朝刊;

  • OFS:輸出列分隔符,用于打印時分割字段蜈缤,默認(rèn)為空格

  • ORS:輸出行分隔符拾氓,用于打印時分割記錄,默認(rèn)為換行符

(二)輸出格式

awk 提供 printf 函數(shù)進(jìn)行格式化輸出功能底哥,具體的使用方式和 C 語法基本一致咙鞍。

基本用法

圖片

常用的格式化方式:

  • %d 十進(jìn)制有符號整數(shù)

  • %u 十進(jìn)制無符號整數(shù)

  • %f 浮點數(shù)

  • %s 字符串

  • %c 單個字符

  • %e 指數(shù)形式的浮點數(shù)

  • %x %X 無符號以十六進(jìn)制表示的整數(shù)

  • %0 無符號以八進(jìn)制表示的整數(shù)

  • %g 自動選擇合適的表示法

  • \n 換行符

  • \t Tab符

(三)編程語句

awk 不僅是一個 Linux 命令行工具,它其實是一門腳本語言叠艳,支持程序設(shè)計語言所有的控制結(jié)構(gòu)奶陈,它支持:

  • 條件語句

  • 循環(huán)語句

  • 數(shù)組

  • 函數(shù)

(四)常用函數(shù)

awk 內(nèi)置了大量的有用函數(shù)功能易阳,也支持自定義函數(shù)附较,允許你編寫自己的函數(shù)來擴(kuò)展內(nèi)置函數(shù)。

這里只簡單羅列一些比較常用的字符串函數(shù):

  • index(s, t) 返回子串 t 在 s 中的位置

  • length(s) 返回字符串 s 的長度

  • split(s, a, sep) 分割字符串潦俺,并將分割后的各字段存放在數(shù)組 a 中

  • substr(s, p, n) 根據(jù)參數(shù)拒课,返回子串

  • tolower(s) 將字符串轉(zhuǎn)換為小寫

  • toupper(s) 將字符串轉(zhuǎn)換為大寫

這里只簡單總結(jié)一些常用的字符串功能函數(shù),具體使用方法事示,還需要你參照前邊的示例程序早像,舉一反三,運用到實際問題中肖爵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卢鹦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子劝堪,更是在濱河造成了極大的恐慌冀自,老刑警劉巖揉稚,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熬粗,居然都是意外死亡搀玖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門驻呐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灌诅,“玉大人,你說我怎么就攤上這事含末〔率埃” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵答渔,是天一觀的道長关带。 經(jīng)常有香客問我,道長沼撕,這世上最難降的妖魔是什么宋雏? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮务豺,結(jié)果婚禮上磨总,老公的妹妹穿的比我還像新娘。我一直安慰自己笼沥,他們只是感情好蚪燕,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奔浅,像睡著了一般馆纳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汹桦,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天鲁驶,我揣著相機(jī)與錄音,去河邊找鬼舞骆。 笑死钥弯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的督禽。 我是一名探鬼主播脆霎,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狈惫!你這毒婦竟也來了睛蛛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忆肾,沒想到半個月后菠红,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡难菌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年试溯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郊酒。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡遇绞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出燎窘,到底是詐尸還是另有隱情摹闽,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布褐健,位于F島的核電站付鹿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚜迅。R本人自食惡果不足惜舵匾,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谁不。 院中可真熱鬧坐梯,春花似錦、人聲如沸刹帕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偷溺。三九已至蹋辅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挫掏,已是汗流浹背侦另。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留砍濒,地道東北人淋肾。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓硫麻,卻偏偏與公主長得像爸邢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拿愧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

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

  • 一杠河、簡介 awk命令是一種編程語言,用于在linux/unix下對文本和數(shù)據(jù)進(jìn)行掃描和處理的工具,其數(shù)據(jù)來源可以為...
    小尛酒窩閱讀 8,423評論 0 0
  • 概述 Awk是一種便于使用且表達(dá)能力強的程序設(shè)計語言券敌,可應(yīng)用于各種計算和數(shù)據(jù)處理任務(wù) 舉例說明 有用的awk程序往...
    saidev閱讀 227評論 0 0
  • 參考文章:https://www.cnblogs.com/along21/p/10366886.html#重要唾戚!參...
    一只煙酒僧閱讀 375評論 0 2
  • 一、awk簡介 awk其名稱得自于它的創(chuàng)始人 Alfred Aho 待诅、Peter Weinberger 和 Bri...
    鐘離惜閱讀 4,947評論 0 2
  • awk命令的基本使用 [root@shellscript ~]# head -n 3 /etc/passwd | ...
    古寒飛閱讀 1,064評論 0 2