Linux 三劍客之 awk 實戰詳解教程

sed 可以實現非交互式的字符串替換,grep 能夠實現有效的過濾功能。與兩者相比,awk 是一款強大的文本分析工具,在對數據分析並生成報告時,顯得尤爲強悍。

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

這篇文章,我仍然秉持着 實用實踐 原則,提供大量的示例,但不會面面俱到。通過本文可以幫助你,快速將 awk 運用起來,這些東西足夠應付工作中大多數應用場景。

場景

學習具體使用前,先來看下 awk 能幹些什麼事情:

1. 能夠將給定的文本內容,按照我們期望的格式輸出顯示,打印成報表。

2. 分析處理系統日誌,快速地分析挖掘我們關心的數據,並生成統計信息;

3. 方便地用來統計數據,比如網站的訪問量,訪問的 IP 量等;

4. 通過各種工具的組合,快速地彙總分析系統的運行信息,讓你對系統的運行了如指掌;

5. 強大的腳本語言表達能力,支持循環、條件、數組等語法,助你分析更加複雜的數據;

......

當然 awk 不僅能做這些事情,當你將它的用法融匯貫通時,可以隨心所欲的按照你的意願,來進行高效的數據分析和統計。

不過我們需要知道,awk 不是萬能的,它比較擅長處理格式化的文本,比如 日誌csv 格式數據等;

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

awk 基本命令格式

結合下圖來詳細說明 awk 工作原理

我們在下邊的示例學習中,要時刻記着:記錄 (Record) 就是字段 (Field) 就是BEGIN 是預處理階段,body 是 awk 真正工作的階段,END 是最後處理階段。

%s 表示字符串佔位符,-4表示列寬度爲 4,且_左對齊_,我們還可以根據需要,列出更復雜的格式來,這裏先不詳細舉例了。

實戰 - 進階

(一)過濾記錄

有些數據可能不是你想要的,可以根據需要進行過濾

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

awk 支持各種比較運算符號 !=><>=<=,其中 $0 表示整行的所有內容。

(二)內置變量

awk 內置了一些變量,更方便我們對數據的處理

過濾第 3 列爲 root 用戶,以及第 2 行內容,且打印時輸出行號。NR 表示當前第幾行,NF表示當前行有幾列。

(三)指定分隔符

我們的數據,不總是以_空格_爲分隔符,我們可以通過 FS 變量指定分隔符。

我們指定分隔符爲 2019,這樣就將行內容分割爲了兩部分,將 2019 替換成了 *

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

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

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

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

實戰 - 高級

(一)條件匹配

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

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

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

另外,可以這樣 /Aug|Dec/ 匹配多個關鍵詞。

模式_取反_可以使用 ! 符號

(二)拆分文件

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

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

(三)if 語句

複雜的條件判斷,可以使用 awk 的 if 語句,awk 的強大正因爲它是個腳本解釋器,擁有一般腳本語言的編程能力,下邊示例通過稍微複雜的條件進行拆分文件

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

(四)統計

統計當前目錄下,所有 *.c*.h 文件所佔用空間大小總和

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

再來看一個例子,統計每個用戶的進程佔用了多少內存,注意取值的是 RSS 那一列

這裏用到了 數組 和 for 循環,值得一提的是,awk 的數組可以理解爲字典或 Map,key 可以是數值和字符串,這種數據類型在平時很常用。

(五)字符串

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

awk 內置支持一系列的字符串函數,length 計算字符串長度,toupper 函數轉換字符串爲大寫。

實戰 - 技巧

爲了從整體上理解 awk 工作機制,我們再來看一個綜合的示例,假設有一個學生成績單:

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

執行 awk 結果如下

我們可以將複雜的 awk 語句寫入腳本文件 cal.awk,然後通過 -f 選項指定從腳本文件執行。

這個簡單示例,完整的體現了 awk 的工作機制和原理,希望通過此示例能夠幫你真正理解 awk 是如何工作的。

總結歸納

通過上述的示例,我們學習到了 awk 的工作原理,下邊我們來總結下幾個概念和常用的知識點。

(一)內置變量

1. 每一行內容記錄,叫做記錄,英文名稱 Record

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

明確這幾個概念後,我們來總結幾個重要的內置變量:

(二)輸出格式

awk 提供 printf 函數進行格式化輸出功能,具體的使用方式和 C 語法基本一致。

基本用法

常用的格式化方式:

(三)編程語句

awk 不僅是一個 Linux 命令行工具,它其實是一門腳本語言,支持程序設計語言所有的控制結構,它支持:

(四)常用函數

awk 內置了大量的有用函數功能,也支持自定義函數,允許你編寫自己的函數來擴展內置函數。

這裏只簡單羅列一些比較常用的字符串函數:

這裏只簡單總結一些常用的字符串功能函數,具體使用方法,還需要你參照前邊的示例程序,舉一反三,運用到實際問題中。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/lp8ujvggJF0ZoeqfGpoV9Q