awk指令
awk也是一個資料處理工具!相較於 sed 常常作用於一整行的處理, awk 則較傾向於一行當中分成數個字段來處理。
.awk語言的最基本功能是在文件或字串中基於指定規則來分解抽取信息,也可以基於指定的規則來輸出數據。
有三種方式呼叫awk
1.命令列方式
awk [-F field-separator] 'commands' input-files
其中,[-F域分隔符號]是可選的,因為awk使用空格或tab鍵作為缺省的域分隔符,因此如果要瀏覽域間有空格的文本,不必指定這個選項,如果要瀏覽諸如passwd文件,此文件各域以冒號作為分隔符,則必須指明-F選項,如:awk -F: 'commands' input -file。
註:在linux系統中用環境變數IFS儲存分隔符號,但根據實際應用也可以改變IFS的值.
例如:
腳本執行結果如下:
腳本執行結果如下:
腳本執行結果如下:指令, input-files 是待處理的檔案。
iput_files可以是多於一個檔案的檔案列表,awk會依序處理列表中的每個檔案。
在awk中,檔案的每一行中,由域分隔符號分開的每一項稱為一個域。通常,在不指名-F域分隔符號的情況下,預設的域分隔符號是空格或tab鍵。
2. shell腳本方式
將所有的Linux Shell中awk指令的用法插入一個文件,並使awk程式可執行,然後Linux Shell中awk指令的用法解釋器作為腳本的首行,以便透過鍵入腳本名稱來呼叫。
相當於shell腳本首行的:#!/bin/sh可以換成:#!/bin/awk
3.將所有的awk指令插入一個單獨文件,然後呼叫:
Awk -f awk-script-file input-files
其中,-ffilefk-script-ffilef是一樣的。
awk的模式和動作
任何awk語句都由模式和動作組成(awk_pattern { actions })。
在一個awk腳本中可能有許多語句。
模式部分決定動作語句何時觸發及觸發事件。處理即對資料進行的操作。如果省略模式部分,動作將時時保持執行狀態。即省略時不對輸入記錄進行匹配比較就執行對應的actions。
模式可以是任何條件語句或正規表示式等。 awk_pattern可以是下列幾種型式:
1) 正規表示式作為awk_pattern:/regexp/例如:awk '/^[a-z]/' input_pfile例如:awk '/^[a-z]/' input_pfile
表達式成立時,觸發對應的actions執行。
① 表達式中可以使用變數(如欄位變數$1,$2等)和/regexp/
② 布林運算式中的運算子:
例如: awk'$2 > 10 "ok"}' input_file
awk '$3 ~ /^d/ {print"ok"}' input_file
③ &&exp(||表達式。 !(非) 可以用於布林表達式或/regexp/之前。
例如: awk '($1 10) {print "ok"}' input _file
使用$1 , $3表示參考第1和第3域,注意這裡用逗號做域分隔。如果希望印製一個有5個網域
的記錄的所有網域,則不必指明$1 , $2 , $3 , $4 , $5,且可使用$0,以所有領域。
為列印一個域或所有域,使用print指令。這是一個awk動作
awk的運行過程:
①如果BEGIN 區塊存在,awk執行它指定的actions。
② awk從輸入檔中讀取一行,稱為一筆輸入紀錄。 (如果輸入檔省略,將從標準輸入讀取)
③ awk將讀入的記錄分割成字段,將第1個字段放入變數$1中,第2個字段放入$2,以此類推。 $0表示整筆記錄。
④把目前輸入記錄依序與每一個awk_cmd中awk_pattern比較,看是否匹配,如果相匹配,就執行對應的actions。如果不匹配,就跳過對應的actions,直到比較完所有的awk_cmd。
⑤當一條輸入記錄比較了所有的awk_cmd後,awk讀取輸入的下一行,繼續重複步驟③和④,這個過程一直持續,直到awk讀取到文件尾。
⑥當awk讀完所有的輸入行後,如果有END,就執行對應的actions。
入門實例:
例1:顯示/etc/passwd檔案中的使用者名稱與登入shell
如果只是顯示/etc/passwd的帳戶和帳戶對應的shell,而與shell間以tab鍵分割
如果只是顯示/etc/passwd檔案中的使用者名稱和登入shell, 而帳戶與shell之間以逗號分割
注:awk的總是輸出到標準輸出,如果想讓awk輸出到文件,可以使用重定向。
例2:顯示/etc/passwd檔案中的UID大於500的所有使用者的使用者名稱和登入shell
例3:如果只是顯示/etc/passwdwd中的
500的用戶名和登入shell,而帳戶與shell之間以逗號分割,而且在所有行添加列名name,shell,在最後一行添加"blue,/bin/nosh"。 註:1.awk 後面接兩個單引號並加上大括號 {} 來設定想要對資料進行的處理動作2.awk工作流程是這樣的:先執行BEGING ,然後讀取文件,讀入有n換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域,隨後開始執行模式所對應的動作。接著開始讀入第二筆記錄······直到所有的記錄都讀完,最後執行END操作。 思考題:如何列印所有記錄(以/etc/passwd中的內容為例) 例4:搜尋/etc/passwd有root關鍵字的所有行 這種是pattern (模式)的使用範例,比對了pattern(這裡是root)的行才會執行action(沒有指定action,預設輸出每行的內容)。 搜尋支援正規表示式,例如找root開頭的: 搜尋/etc/passwd有root關鍵字的所有行,並顯示對應的shell 這裡指定了action }awk內建變數
awk有許多內建變數用來設定環境訊息,下面給出了最常用的一些變數。
FILENAME awk瀏覽的檔案名稱
FS 設定輸入域分隔符,以等價的記錄數(awk所處理的是第幾行資料)
例6:統計/etc/passwd:檔名,每行的行號,每行的列數,對應的完整行內容:
統計/etc/passwd的帳戶人數
count是自訂變數。之前的action{}裡都是只有一個print,其實print只是一個語句,而action{}可以有多個語句,以;號隔開。
這裡沒有初始化count,雖然預設是0,但是妥當的做法還是初始化為0:例8:統計某個資料夾下的檔案所佔用的位元組數
如果以M為單位顯示:
注意:以上統計沒有包含子目錄中的檔案。
如果想快速查看所有檔案的長度及其總和,但要排除子目錄,如何實現: