<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux 三劍客之 awk 實(shí)戰(zhàn)詳解教程

          共 3884字,需瀏覽 8分鐘

           ·

          2021-03-26 01:18


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

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

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

          這篇文章,我仍然秉持著 實(shí)用實(shí)踐 原則,提供大量的示例,但不會(huì)面面俱到。通過(guò)本文可以幫助你,快速將 awk 運(yùn)用起來(lái),這些東西足夠應(yīng)付工作中大多數(shù)應(yīng)用場(chǎng)景。

          場(chǎng)景

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

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

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

          3. 方便地用來(lái)統(tǒng)計(jì)數(shù)據(jù),比如網(wǎng)站的訪問(wèn)量,訪問(wèn)的 IP 量等;

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

          5. 強(qiáng)大的腳本語(yǔ)言表達(dá)能力,支持循環(huán)、條件、數(shù)組等語(yǔ)法,助你分析更加復(fù)雜的數(shù)據(jù);

          ......

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

          不過(guò)我們需要知道,awk 不是萬(wàn)能的,它比較擅長(zhǎng)處理格式化的文本,比如 日志csv 格式數(shù)據(jù)等;

          原理

          我們先來(lái)簡(jiǎn)單了解 awk 基本工作原理,通過(guò)下邊的圖文講述,希望你能了解 awk 到底是如何工作的。

          awk 基本命令格式

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

          • 首先,執(zhí)行關(guān)鍵字 BEGIN 標(biāo)識(shí)的 {} 中的命令;
          • 完成 BEGIN 大括號(hào)中命令的后,開(kāi)始執(zhí)行 body 命令;
          • 逐行讀取數(shù)據(jù),默認(rèn)讀到 \n 分割的內(nèi)容為一條 記錄,其實(shí)就是的概念;
          • 記錄按照指定的分隔符劃分為 字段,其實(shí)就是的概念;
          • 循環(huán)執(zhí)行 body 塊中的命令,每讀取一行,執(zhí)行一次 body,最終完成 body 執(zhí)行;
          • 最后,執(zhí)行 END 命令,通常會(huì)在 END 中輸出最后的結(jié)果;

          awk 是輸入驅(qū)動(dòng)的,有多少輸入行,就會(huì)執(zhí)行多少次 body 命令。

          我們?cè)谙逻叺氖纠龑W(xué)習(xí)中,要時(shí)刻記著:記錄 (Record) 就是字段 (Field) 就是BEGIN 是預(yù)處理階段,body 是 awk 真正工作的階段,END 是最后處理階段。

          實(shí)戰(zhàn) - 入門(mén)

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

          好了,我們先來(lái)一個(gè)最簡(jiǎn)單最常用的 awk 示例,輸出第 1、4、8 列:

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

          再來(lái)看下 awk 比較實(shí)用的功能 格式化輸出。和 C 語(yǔ)言的 printf 格式輸出是一毛一樣,我個(gè)人特別喜歡這種格式化方式,而不是 C++ 中的流的方式。

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

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

          (一)過(guò)濾記錄

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

          上邊的過(guò)濾條件為,第 3 列為 root 且第 6 列為 10 的行,才會(huì)被輸出。

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

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

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

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

          (三)指定分隔符

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

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

          上邊的命令也可以通過(guò) -F 選項(xiàng)指定分割符

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

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

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

          實(shí)戰(zhàn) - 高級(jí)

          (一)條件匹配

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

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

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

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

          模式取反可以使用 ! 符號(hào)

          (二)拆分文件

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

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

          (三)if 語(yǔ)句

          復(fù)雜的條件判斷,可以使用 awk 的 if 語(yǔ)句,awk 的強(qiáng)大正因?yàn)樗莻€(gè)腳本解釋器,擁有一般腳本語(yǔ)言的編程能力,下邊示例通過(guò)稍微復(fù)雜的條件進(jìn)行拆分文件

          要注意,if 語(yǔ)句是在大括號(hào)里邊的。

          (四)統(tǒng)計(jì)

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

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

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

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

          (五)字符串

          通過(guò)下邊簡(jiǎn)單示例,展示 awk 對(duì)字符串操作的支持

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

          實(shí)戰(zhàn) - 技巧

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

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

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

          我們可以將復(fù)雜的 awk 語(yǔ)句寫(xiě)入腳本文件 cal.awk,然后通過(guò) -f 選項(xiàng)指定從腳本文件執(zhí)行。

          • BEGIN 階段,我們初始化了相關(guān)變量,并打印了表頭的格式
          • body 階段,我們讀取每一行數(shù)據(jù),計(jì)算該學(xué)科和該同學(xué)的總成績(jī)
          • END 階段,我們先打印了表尾的格式,并打印總成績(jī),以及計(jì)算了平均值

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

          總結(jié)歸納

          通過(guò)上述的示例,我們學(xué)習(xí)到了 awk 的工作原理,下邊我們來(lái)總結(jié)下幾個(gè)概念和常用的知識(shí)點(diǎn)。

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

          1. 每一行內(nèi)容記錄,叫做記錄,英文名稱(chēng) Record

          2. 每行中通過(guò)分隔符隔開(kāi)的每一列,叫做字段,英文名稱(chēng) Field

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

          • NR:表示當(dāng)前的行數(shù);
          • NF:表示當(dāng)前的列數(shù);
          • RS:行分隔符,默認(rèn)是換行;
          • FS:列分隔符,默認(rèn)是空格和制表符;
          • OFS:輸出列分隔符,用于打印時(shí)分割字段,默認(rèn)為空格
          • ORS:輸出行分隔符,用于打印時(shí)分割記錄,默認(rèn)為換行符

          (二)輸出格式

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

          基本用法

          常用的格式化方式:

          • %d 十進(jìn)制有符號(hào)整數(shù)
          • %u 十進(jìn)制無(wú)符號(hào)整數(shù)
          • %f 浮點(diǎn)數(shù)
          • %s 字符串
          • %c 單個(gè)字符
          • %e 指數(shù)形式的浮點(diǎn)數(shù)
          • %x %X 無(wú)符號(hào)以十六進(jìn)制表示的整數(shù)
          • %0 無(wú)符號(hào)以八進(jìn)制表示的整數(shù)
          • %g 自動(dòng)選擇合適的表示法
          • \n 換行符
          • \t Tab符

          (三)編程語(yǔ)句

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

          • 條件語(yǔ)句
          • 循環(huán)語(yǔ)句
          • 數(shù)組
          • 函數(shù)

          (四)常用函數(shù)

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

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

          • index(s, t) 返回子串 t 在 s 中的位置
          • length(s) 返回字符串 s 的長(zhǎng)度
          • split(s, a, sep) 分割字符串,并將分割后的各字段存放在數(shù)組 a 中
          • substr(s, p, n) 根據(jù)參數(shù),返回子串
          • tolower(s) 將字符串轉(zhuǎn)換為小寫(xiě)
          • toupper(s) 將字符串轉(zhuǎn)換為大寫(xiě)

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

          ~~~~~ End ~~~~~

          干貨分享

          最近將個(gè)人學(xué)習(xí)筆記整理成冊(cè),使用PDF分享。關(guān)注我,回復(fù)如下代碼,即可獲得百度盤(pán)地址,無(wú)套路領(lǐng)取!

          ?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記;?003:《Java面試寶典》?004:《Docker開(kāi)源書(shū)》?005:《Kubernetes開(kāi)源書(shū)》?006:《DDD速成(領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)速成)》?007:全部?008:加技術(shù)群討論

          關(guān)注我

          喜歡就點(diǎn)個(gè)"在看"唄^_^

          瀏覽 58
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费xxxx视频 | 美女黄色裸体网站 | 欧美性爱一区二区 | AV网站免费看 | 北条麻纪一区二区三区在线观看视频 |