0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux三劍客之a(chǎn)wk實戰(zhàn)詳解教程

Linux愛好者 ? 來源:Linux愛好者 ? 作者:Linux愛好者 ? 2021-03-31 17:12 ? 次閱讀

我們知道 Linux 三劍客,它們是grep、sed、awk。在前邊已經(jīng)講過 grep 和 sed,沒看過的同學(xué)可以直接點擊閱讀,今天要分享的是更為強(qiáng)大的 awk。

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

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

這篇文章,我仍然秉持著實用、實踐原則,提供大量的示例,但不會面面俱到。通過本文可以幫助你,快速將 awk 運(yùn)用起來,這些東西足夠應(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)的運(yùn)行信息,讓你對系統(tǒng)的運(yùn)行了如指掌;

5. 強(qiáng)大的腳本語言表達(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 基本命令格式

ff5d0080-8d7f-11eb-8b86-12bb97331649.png

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

ff88369c-8d7f-11eb-8b86-12bb97331649.png

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

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

逐行讀取數(shù)據(jù),默認(rè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

ffa8cede-8d7f-11eb-8b86-12bb97331649.png

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

ffee4f0e-8d7f-11eb-8b86-12bb97331649.png

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

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

001b08be-8d80-11eb-8b86-12bb97331649.png

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

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

(一)過濾記錄

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

002d2c38-8d80-11eb-8b86-12bb97331649.png

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

awk 支持各種比較運(yùn)算符號 !=、>、<、>=、<=,其中 $0 表示整行的所有內(nèi)容。

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

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

005a5032-8d80-11eb-8b86-12bb97331649.png

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

(三)指定分隔符

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

0080be48-8d80-11eb-8b86-12bb97331649.png

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

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

00ba60a8-8d80-11eb-8b86-12bb97331649.png

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

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

00ccbca8-8d80-11eb-8b86-12bb97331649.png

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

實戰(zhàn) - 高級

(一)條件匹配

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

011d88a4-8d80-11eb-8b86-12bb97331649.png

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

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

014dfeda-8d80-11eb-8b86-12bb97331649.png

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

模式取反可以使用 ! 符號

017270e4-8d80-11eb-8b86-12bb97331649.png

(二)拆分文件

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

01807004-8d80-11eb-8b86-12bb97331649.png

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

(三)if 語句

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

01bf3564-8d80-11eb-8b86-12bb97331649.png

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

(四)統(tǒng)計

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

01e08bce-8d80-11eb-8b86-12bb97331649.png

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

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

020c8828-8d80-11eb-8b86-12bb97331649.png

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

(五)字符串

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

0231e280-8d80-11eb-8b86-12bb97331649.png

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

實戰(zhàn) - 技巧

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

026bd4d6-8d80-11eb-8b86-12bb97331649.png

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

02802c38-8d80-11eb-8b86-12bb97331649.png

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

02b2eef2-8d80-11eb-8b86-12bb97331649.png

我們可以將復(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 語法基本一致。

基本用法

02e8b528-8d80-11eb-8b86-12bb97331649.png

常用的格式化方式:

%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 自動選擇合適的表示法

換行符

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ù),具體使用方法,還需要你參照前邊的示例程序,舉一反三,運(yùn)用到實際問題中。

責(zé)任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11128

    瀏覽量

    207957
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1916

    瀏覽量

    34391
  • 數(shù)據(jù)分析
    +關(guān)注

    關(guān)注

    2

    文章

    1395

    瀏覽量

    33914
收藏 人收藏

    評論

    相關(guān)推薦

    《七下天山》“七利刃”:“新一代”漏洞掃描管理系統(tǒng)

    。該平臺七個方面功能尤其強(qiáng)大,堪稱梁羽生的武俠小說《七下天山》“七利刃”: ?日月?:多租戶管理。不同租戶間能設(shè)置符合各租戶自身特點的漏洞掃描策略,并只能查看當(dāng)前租戶的漏洞分別
    的頭像 發(fā)表于 09-09 11:23 ?249次閱讀

    北京迅為RK3568開發(fā)板嵌入式學(xué)習(xí)Linux驅(qū)動全新更新-CAN+

    北京迅為RK3568開發(fā)板嵌入式學(xué)習(xí)Linux驅(qū)動全新更新-CAN+
    的頭像 發(fā)表于 09-04 15:29 ?204次閱讀
    北京迅為RK3568開發(fā)板嵌入式學(xué)習(xí)<b class='flag-5'>之</b><b class='flag-5'>Linux</b>驅(qū)動全新更新-CAN+

    慧能泰推出HP1500+HP3500+HUSB338E 20W快充方案

    好家伙,咱爺研制的這2200W交流電直充可不興用啊。充電器首要是安全,然后才是速度。比如慧能泰新推出的這款HP1500+HP3500+HUSB338E 20W快充方案,AC-DC和協(xié)議芯片均來自慧能泰最新研發(fā)的產(chǎn)品,三劍客組合出擊,打造高性價比的20W快充高效方案。
    的頭像 發(fā)表于 07-08 15:20 ?1485次閱讀
    慧能泰推出HP1500+HP3500+HUSB338E 20W快充方案

    【直播預(yù)告】Vision Board AI 實戰(zhàn)分享

    本周五晚,嵌入式工程師王凱將帶來精彩的RA8VisionBoardAI實戰(zhàn)分享!RT-Thread攜手瑞薩電子及華秋電子在四月份,推出了VisionBoard創(chuàng)營計劃。這一計劃分為四個階段:軟硬件
    的頭像 發(fā)表于 05-24 08:35 ?200次閱讀
    【直播預(yù)告】Vision Board AI <b class='flag-5'>實戰(zhàn)</b>分享

    LM61089A/B/Q三劍客為SLIC接口電路提供保護(hù)

    電信通信設(shè)備需要通過CR-1089-CORE 認(rèn)證,GR-1089-CORE 是NEBS 認(rèn)證中關(guān)于網(wǎng)絡(luò)設(shè)備電磁兼容性和電氣安全的標(biāo)準(zhǔn),它是評定通信設(shè)備在遭受到高能量脈沖干擾時的抗干擾能力的通用標(biāo)準(zhǔn)。許多客戶通信設(shè)備對于GR-1089-CORE認(rèn)證很難通過,費盡周折,發(fā)現(xiàn)GR-1089-CORE標(biāo)準(zhǔn)要求很高。針對此問題上海雷卯推出LM61089A/B/Q,幫助客戶解決頭疼的GR-1089-CORE認(rèn)證問題。現(xiàn)在先了解為什么要通過GR-1089-CORE認(rèn)證, 不做防雷保護(hù),SLIC接口存在什么問題。 1. SLIC接口電路存在雷擊破壞
    的頭像 發(fā)表于 04-20 11:37 ?250次閱讀
    LM61089A/B/Q<b class='flag-5'>三劍客</b>為SLIC接口電路提供保護(hù)

    上海雷卯LM61089A/B/Q三劍客為SLIC接口電路提供保護(hù)

    講解電信通信設(shè)備需要通過CR-1089-CORE認(rèn)證,GR-1089-CORE是NEBS認(rèn)證中關(guān)于網(wǎng)絡(luò)設(shè)備電磁兼容性和電氣安全的標(biāo)準(zhǔn),它是評定通信設(shè)備在遭受到高能量脈沖干擾時的抗干擾能力的通用標(biāo)準(zhǔn)。許多客戶通信設(shè)備對于GR-1089-COR
    的頭像 發(fā)表于 04-19 08:02 ?260次閱讀
    上海雷卯LM61089A/B/Q<b class='flag-5'>三劍客</b>為SLIC接口電路提供保護(hù)

    CS32L010 Deepsleep 模式下,保留 GPIO/AWK 喚醒,低功耗電流是多少?

    CS32L010 Deepsleep 模式下,保留 GPIO/AWK 喚醒,低功耗電流是多少? 答:大概是1.0uA
    發(fā)表于 03-22 11:33

    宋仕強(qiáng)論道華強(qiáng)北背包(三十九)

    華強(qiáng)北洶涌的人流,主要是在華強(qiáng)北經(jīng)營的商戶和來華強(qiáng)北的客戶,還包括華強(qiáng)北的背包,背包是華強(qiáng)北的特殊群體,來自于全國各地甚至于世界各地,國外的背包也是華強(qiáng)北國際化的主要渠道。一個是國內(nèi)的背包
    發(fā)表于 01-09 10:59

    嵌入式Linux應(yīng)用程序開發(fā)詳解-第3章

    電子發(fā)燒友網(wǎng)站提供《嵌入式Linux應(yīng)用程序開發(fā)詳解-第3章.pdf》資料免費下載
    發(fā)表于 11-16 11:19 ?0次下載
    嵌入式<b class='flag-5'>Linux</b>應(yīng)用程序開發(fā)<b class='flag-5'>詳解</b>-第3章

    嵌入式Linux應(yīng)用程序開發(fā)詳解-第2章

    電子發(fā)燒友網(wǎng)站提供《嵌入式Linux應(yīng)用程序開發(fā)詳解-第2章.pdf》資料免費下載
    發(fā)表于 11-16 11:18 ?0次下載
    嵌入式<b class='flag-5'>Linux</b>應(yīng)用程序開發(fā)<b class='flag-5'>詳解</b>-第2章

    嵌入式Linux應(yīng)用程序開發(fā)詳解-第1章

    電子發(fā)燒友網(wǎng)站提供《嵌入式Linux應(yīng)用程序開發(fā)詳解-第1章.pdf》資料免費下載
    發(fā)表于 11-16 11:17 ?0次下載
    嵌入式<b class='flag-5'>Linux</b>應(yīng)用程序開發(fā)<b class='flag-5'>詳解</b>-第1章

    linux命令行與shell編程實戰(zhàn)

    Linux命令行與Shell編程實戰(zhàn)主要涉及以下內(nèi)容: Linux命令行基礎(chǔ):學(xué)習(xí)Linux命令行的基本操作,如文件管理、進(jìn)程管理、網(wǎng)絡(luò)配置等。熟悉使用命令行能夠提高工作效率,提升自己
    的頭像 發(fā)表于 11-08 10:57 ?633次閱讀

    如何像 awk一樣分割字符串

    若你使用過 Shell 中的 awk 工具,會發(fā)現(xiàn)用它來分割字符串是非常方便的。特別是多個連續(xù)空格會被當(dāng)做一個處理。 [root @localhost ~] # cat demo.txt hello
    的頭像 發(fā)表于 11-02 11:14 ?601次閱讀
    如何像 <b class='flag-5'>awk</b>一樣分割字符串

    電阻維修檢測實戰(zhàn)

    電阻維修檢測實戰(zhàn)
    發(fā)表于 10-15 11:23 ?3次下載

    讀《玄鐵RISC-V處理器入門與實戰(zhàn)

    。 全方位的介紹,帶領(lǐng)我們了解RISC-V性能強(qiáng)大,不再局限于一個跑馬燈、Hello World工程,而是開發(fā)高大上的系統(tǒng)級應(yīng)用。未來RISC-V如果能在應(yīng)用碎片化、開發(fā)效率低、軟硬件適配難等問題上不斷優(yōu)化,相信將迎來更大的發(fā)展市場空間。 *附件:玄鐵RISC-V處理器入門與
    發(fā)表于 09-28 11:58