linux shell腳本之awk利器

我們都知道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),回覆:領取學習資料。或者回復:進入技術交流羣。網盤資料有如下:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章