awk命令簡介

2021-09-08 17:16:01 字數 4166 閱讀 4154

awk是乙個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。

awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 awk 的 gnu 版本。

awk其名稱得自于它的創始人 alfred aho 、peter weinberger 和 brian kernighan 姓氏的首個字母。實際上 awk 的確擁有自己的語言: awk 程式語言 , 三位建立者已將它正式定義為「樣式掃瞄和處理語言」。它允許您建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及生成報表,還有無數其他的功能。

樣式處理功能

cat /etc/passwd|head -5

#result

root:x:

0:0:root:/root:/bin/bash

bin:x:

1:1:bin:/bin:/sbin/nologin

daemon:x:

2:2:daemon:/sbin:/sbin/nologin

adm:x:

3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

處理後:

cat /etc/passwd|head -10|awk  -f ':'

'begin end

'#result

name,shell

root,/bin/bash

bin,/sbin/nologin

daemon,/sbin/nologin

adm,/sbin/nologin

lp,/sbin/nologin

blue,/bin/nosh

awk工作流程是這樣的:先執行beging,然後讀取檔案,讀入有/n換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第乙個域,$n表示第n個域,隨後開始執行模式所對應的動作action。接著開始讀入第二條記錄······直到所有的記錄都讀完,最後執行end操作。

模板匹配功能

awk

''

pattern 表示 awk 在資料中查詢的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程式中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 pattern就是要表示的正規表示式,用斜槓括起來。

比如:搜尋/etc/passwd有root關鍵字的所有行

awk -f: '

/root/

' /etc/passwd

#result

root:x:

0:0:root:/root:/bin/bash

operator:x:

11:0:operator:/root:/sbin/nologin

這種是pattern的使用示例,匹配了pattern(這裡是root)的行才會執行action(沒有指定action,預設輸出每行的內容)。搜尋支援正則,例如找root開頭的: awk -f: '/^root/' /etc/passwd

搜尋/etc/passwd有root關鍵字的所有行,並顯示對應的shell

awk -f: '

/root/

' /etc/passwd

#result

/bin/bash

/sbin/nologin

awk內建變數

awk有許多內建變數用來設定環境資訊,這些變數可以被改變,下面給出了最常用的一些變數。

argc        命令列引數個數

ar** 命令列引數排列

environ 支援佇列中系統環境變數的使用

filename awk瀏覽的檔名

fnr 瀏覽檔案的記錄數

nr 已讀的記錄數

nf 瀏覽記錄的域的個數

fs 設定輸入域分隔符,等價於命令列 -f選項

ofs 輸出域分隔符

rs 控制記錄分隔符

ors 輸出記錄分隔符

統計/etc/passwd:檔名,每行的行號,每行的列數,對應的完整行內容:

awk  -f ':'

'' /etc/passwd

使用printf替代print,可以讓**更加簡潔,易讀

awk  -f ':'

'' /etc/passwd

awk中同時提供了print和printf兩種列印輸出的函式。其中print函式的引數可以是變數、數值或者字串。字串必須用雙引號引用,引數用逗號分隔。如果沒有逗號,引數就串聯在一起而無法區分。printf函式,其用法和c語言中printf基本相似,可以格式化字串,輸出複雜時,printf更加好用,**更易懂。

awk程式設計

變數和賦值

除了awk的內建變數,awk還可以自定義變數。下面統計/etc/passwd的賬戶人數

awk

' end

' /etc/passwd

root:x:

0:0:root:/root:/bin/bash ...

user count is

40

這裡沒有初始化count,雖然預設是0,但是妥當的做法還是初始化為0:

awk

'begin end

' /etc/passwd

[start]user count is

0root:x:

0:0:root:/root:/bin/bash

...

[end]user count is

40

統計某個資料夾下的檔案占用的位元組數

ls -l |awk

'begin end

'[end]size is

439289

如果以m為單位顯示:

ls -l |awk

'begin end

'[end]size is

0.418939 m

條件語句

if

(expression)

if(expression)

else

if(expression)

else

if(expression1)

else

迴圈語句

awk中的迴圈語句同樣借鑑於c語言,支援while、do/while、for、break、continue,這些關鍵字的語義和c語言中的語義完全相同。

陣列

因為awk中陣列的下標可以是數字和字母,陣列的下標通常被稱為關鍵字(key)。值和關鍵字都儲存在內部的一張針對key/value應用hash的**裡。由於hash不是順序儲存,因此在顯示陣列內容時會發現,它們並不是按照你預料的順序顯示出來的。陣列和變數一樣,都是在使用時自動建立的,awk也同樣會自動判斷其儲存的是數字還是字串。一般而言,awk中的陣列用來從記錄中收集資訊,可以用於計算總和、統計單詞以及跟蹤模板被匹配的次數等等。

顯示/etc/passwd的賬戶

awk -f ':'

'begin ; end

' /etc/passwd

0root

1bin

2daemon

3adm4lp

...

計算兩個檔案的差集

awk

'if(nr!=fnr && !($1 in a))print}

' file1 file2

awk程式設計的內容極多,這裡只羅列簡單常用的用法,更多請參考

awk命令簡介

在shell命令或程式設計中,可以用awk強大的的文字處理能力。如果要格式化報文或從乙個大的文字檔案中抽取資料報,那麼awk可完成這些任務。awk是一種解釋的程式語言。awk也是shell過濾工具中最難掌握的。awk是一種自解釋的程式語言。結合awk和sed和grep,將會使awk程式設計更加容易。...

awk陣列簡介

一 定義 在 awk 中,陣列是關聯陣列,它的特點是 1 陣列的下標可以是整數,也可以是負數甚至是字串 2 陣列的下標可以不連續。awk 的變數 ignorecase 的值不影響陣列下標。當 awk 建立乙個陣列的時候,如果沒有指定下標,預設已連續整數作為下標,起始值是 1.awk 的陣列是什麼高效...

awk陣列簡介

一 定義 在 awk 中,陣列是關聯陣列,它的特點是 1 陣列的下標可以是整數,也可以是負數甚至是字串 2 陣列的下標可以不連續。awk 的變數 ignorecase 的值不影響陣列下標。當 awk 建立乙個陣列的時候,如果沒有指定下標,預設已連續整數作為下標,起始值是 1.awk 的陣列是什麼高效...