首頁 > php教程 > PHP开发 > Linux Shell中awk指令的用法

Linux Shell中awk指令的用法

高洛峰
發布: 2016-12-15 11:35:05
原創
1686 人瀏覽過

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的值.

例如:

Linux Shell中awk指令的用法

腳本執行結果如下:

Linux Shell中awk指令的用法

腳本執行結果如下:

腳本執行結果如下:指令, 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/

② 布林運算式中的運算子:



關係運算子: 符合運算子: value ~ /regexp/ 如果value符合/regexp/,則回傳真value!~ /regexp/ 如果value不符/regexp/,則回傳真

例如: awk'$2 > 10 "ok"}' input_file
      awk '$3 ~ /^d/ {print"ok"}' input_file

③ &&exp(||表達式。 !(非) 可以用於布林表達式或/regexp/之前。

例如: awk '($1 10) {print "ok"}' input _file

模式包括兩個特殊字段 BEGIN和END。使用BEGIN語句設定計數和列印頭。 BEGIN語句使用在任何文字瀏覽動作之前,之後文字瀏覽動作依據輸入文字開始執行。 END語句用來在awk完成文字瀏覽動作後列印輸出文字總數和結尾狀態標誌。


實際動作在大括號{ }內指示。動作大多用來列印,但還有一些較長的程式碼諸如i f和循環語句及循環退出結構。如果不指明採取動作,awk將列印出所有瀏覽出來的記錄。


awk執行時,其瀏覽域標記為$1,$2...$n。這種方法稱為域識別。使用這些域標識將更容易對域進行進一步處理。 🎜🎜🎜🎜

使用$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 

Linux Shell中awk指令的用法

如果只是顯示/etc/passwd的帳戶和帳戶對應的shell,而與shell間以tab鍵分割

Linux Shell中awk指令的用法

如果只是顯示/etc/passwd檔案中的使用者名稱和登入shell, 而帳戶與shell之間以逗號分割

Linux Shell中awk指令的用法

注:awk的總是輸出到標準輸出,如果想讓awk輸出到文件,可以使用重定向。


例2:顯示/etc/passwd檔案中的UID大於500的所有使用者的使用者名稱和登入shell

Linux Shell中awk指令的用法

例3:如果只是顯示/etc/passwdwd中的

500的用戶名和登入shell,而帳戶與shell之間以逗號分割,而且在所有行添加列名name,shell,在最後一行添加"blue,/bin/nosh"。

Linux Shell中awk指令的用法

註:

1.awk 後面接兩個單引號並加上大括號 {} 來設定想要對資料進行的處理動作

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

思考題:如何列印所有記錄(以/etc/passwd中的內容為例)

Linux Shell中awk指令的用法

例4:搜尋/etc/passwd有root關鍵字的所有行

Linux Shell中awk指令的用法

這種是pattern (模式)的使用範例,比對了pattern(這裡是root)的行才會執行action(沒有指定action,預設輸出每行的內容)。

搜尋支援正規表示式,例如找root開頭的:

Linux Shell中awk指令的用法

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

Linux Shell中awk指令的用法

這裡指定了action }


例5:顯示最近登入系統的5個使用者訊息,只顯示使用者名稱和IP位址

使用last指令可以查看最近登入的使用者資訊。如下圖所示:

Linux Shell中awk指令的用法

使用awk指令抽取使用者名稱和IP區域的資料

Linux Shell中awk指令的用法

Linux Shell中awk指令的用法

🎜

awk內建變數

awk有許多內建變數用來設定環境訊息,下面給出了最常用的一些變數。

 FILENAME awk瀏覽的檔案名稱

 FS   設定輸入域分隔符,以等價的記錄數(awk所處理的是第幾行資料)

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


顯示所有帳戶的記錄,並帶有其記錄號,並在END部分打印輸入文件名

Linux Shell中awk指令的用法

除了awk的內置變量,awk還可以自定義變量

Linux Shell中awk指令的用法

除了awk的內置變量,awk還可以自訂變量

統計/etc/passwd的帳戶人數

count是自訂變數。之前的action{}裡都是只有一個print,其實print只是一個語句,而action{}可以有多個語句,以;號隔開。 Linux Shell中awk指令的用法

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

例8:統計某個資料夾下的檔案所佔用的位元組數Linux Shell中awk指令的用法

如果以M為單位顯示:Linux Shell中awk指令的用法

注意:以上統計沒有包含子目錄中的檔案。 Linux Shell中awk指令的用法

如果想快速查看所有檔案的長度及其總和,但要排除子目錄,如何實現:

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板