我們都知道awk是專門爲文本處理設計的編程語言,也是一個應用程序,幾乎所有Linux發行版本都自帶這個程序。我們通常用它進行數據掃描、過濾、統計彙總工作。本文只介紹awk的命令行用法,對於大多數場合,應該足夠用了。
awk基本語法
awk 命令的基本格式如下:
awk ‘條件1 {動作 1} 條件 2 {動作 2} …’ 文件名
awk語法由一系列條件和動作組成,在花括號內可以多個動作,在多個動作之間是有分號分隔,在多個條件和動作之間可以有若干空格,也可以沒有。
內置變量
$0 | 當前記錄(作爲單個變量) |
---|---|
FS | 輸入字段分隔符 默認是空格 |
NF | 當前記錄中的字段個數,就是有多少列 |
$1~ $n | 當前記錄的第n個字段,字段間由FS分隔 |
NR | 已經讀出的記錄數,就是行號,從1開始 |
RS | 輸入的記錄他隔符默 認爲換行符 |
OFS | 輸出字段分隔符 默認也是空格 |
ORS | 輸出的記錄分隔符,默認爲換行符 |
FNR | 當前記錄數 |
OFMT | 數字的輸出格式 %.6g |
ARGC | 命令行參數個數 |
ARGV |
基本用法
我們先來學習 awk 的基本用法,也就是隻看看格式化輸出動作是幹什麼的。
在終端上輸入 free
查看內存
print的簡單使用
那如果我們打印第三列的話,可以使用free | awk '{print $3}'
可以看到free輸出三行內容,awk是逐行處理工具。如果匹配成功則執行print $3 這個動作。有些朋友會問,print $3 這個動作這個動作只寫一次,爲什麼執行多次呢?awk隱藏了循環,條件匹配多次,動作就會被執行多少次。
打印文本內容
text.txt
hello world
this is test
C C++ python go
輸出行號 NR
awk內置變量NR爲當前的行號,當awk隱含free命令輸出的第1行時執行print NR後屏幕輸出當前行號1。依次讀取下去。
打印當前行行號
爲什麼輸出行爲4,原因是有換行。
輸出每行數據的列數 NF
awk內置變量NF爲當前行的字段列數,例如 free | awk '{print NF}'
打印每行的列數
(NF-1)代表倒數第二個字段。
自定義變量
awk 可以通過 -v 選項設置或者修改變量,我們可以使用-v定義新的變量,也可以使用該選項修改內置變量的值
定義變量,輸出變量。
因爲自定義數據行字段的分隔符屬於經常使用的功能,爲了方便自定義字段分隔符,awk程序還替換了一個-F選項,可以直接指定數據字段的分隔符。
test.txt
hello: world
this: is: test
C: C++: python: go
定義冒號爲字段分隔符
text.txt
hello world
this is test
C C++ python go
默認字段分隔符爲空格
定義字段分隔符爲冒號
內置變量OFS保存的是輸出字段的分隔符,默認空格,而ORS保存的是輸出記錄的分隔符,默認爲換行符\n。
print指令
使用print指令輸出特定數據時,我們可以輸出變量的數據,同時也還可以直接輸出變量,如果是字符串常量需要使用雙引號括起來,如果是數字常量則可以直接打印。
條件匹配
下面開始編寫條件匹配案例,awk支持使用正則進行模糊匹配,也支持字符串和數字的精確匹配。還支持邏輯與和邏輯或。
text.txt
hello world
this is test
C C++ python go
在兩個數據之間進行正則匹配需要使用正則比較符(~)進行匹配比較
查看head -2 /etc/passwd
文件內容,匹配第三列小於10的行。
上面的這條命令逐行精準匹配 /etc/passwd文件的第三行,如果第三行的數組小於10,則打印該行所有數據的內容。
僅顯示第四行數據內容
滿足兩個條件,邏輯與
滿足兩個條件,邏輯或
查看當前登錄信息
查看文件系統信息
上面的命令先通過文件系統信息,使用tail -n + 2可以從第2行開始顯示文件系統信息,這樣就可以把不包含的數據的標題行去除,awk每讀取一行數據就執行一次 sum+=$4,sum變量沒有初始化定義,因此初始化值爲0,而df輸出的每行第四列爲剩餘容量。
總結
awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤爲強大。
本篇快速瞭解awk相關知識點,相對比較粗糙,我是參考awk的man手冊以及Linux Shell 核心編程指南總結而成的,相信本篇文章可以讓大家對awk有一個大致的瞭解,歡迎大家一起交流。
參考:Linux Shell 核心編程指南
歡迎關注公衆號【程序猿編碼】,添加本人微信號(17865354792),回覆:領取學習資料。或者回復:進入技術交流羣。網盤資料有如下: