1. 程式人生 > >Linux的awk命令簡單操作

Linux的awk命令簡單操作

issue lena 關系表達式 空白字符 加法 宋體 tle 讀取 組合語句

awk是一個編程工具,他有完整的語法和命令。在bash中,awk更多的用於處理列內容(我是這麽認為的,僅供參考)

awk程序的執行邏輯

首先將文本內容讀入到內存中,根據字段分隔符,在讀取文本內容的過程中把讀入的內容分段,第一個字段對應$1,第二個字段對應$2,依次類推,$0代表所有的字段。

註意:

1、在awk程序中,變量的使用不需要帶$符號,因為$符號表示字段。

2、整個執行語句必須被'{}'包裹。

3、awk程序,在處理文本的時候是一次處理一行內容。


先簡單演示一下

技術分享圖片

技術分享圖片

這個例子中,awk程序將文本內容中的第二列和第四列進行了輸出。

技術分享圖片

這個例子主要是證明,awk每次處理一行內容。在例子中,awk處理了兩行內容,所以hello輸出的兩次。字段之間用逗號隔開。

技術分享圖片

這個例子中,hello與$2之間沒有逗號,所以輸出的內容中hello與$2所代表的的內容連在一起。

技術分享圖片

這個例子中print後面沒有跟任何參數,所以這個例子證明,print默認是輸出所有內容


選項:

-F 指明輸入時用到的字段分隔符

技術分享圖片

這個例子中-F 指定了分隔符是:


變量

如果要使用變量就要使用-v這個選項

內建變量FS 這個等價於-F 讀入文件時的分隔符 默認使用空白字符作為分隔符

技術分享圖片


內建變量 OFS awk在輸出時默認使用空白字符作為分隔符,也可以通過OFS進行指定



原本空白的地方被@替換了


內建變量RS,awk的在讀入內容是的換行符,遇到這個符號就換行。默認使用\n作為換行符

技術分享圖片

原本一行的內容被拆分成了若幹行


內建變量ORS,awk在輸出內容時默認使用\n作為換行符,也可以進行改變

技術分享圖片

技術分享圖片

這個例子中,需要註意的是每一個變量之前必須有一個-v的選項,不然系統會報錯。

原本需要換行的輸出,由於換行符改為#號,所以#號代替了換行。


內建變量NF 表示每一行字段的數量

技術分享圖片

awk默認以空白符作為分隔符,/etc/passwd的每行內容基本上沒有空白字符,所以一行就是一個分段。

技術分享圖片

在讀入文本內容時,以冒號作為分隔符,每一行被分為7段,那麽NF就等於7


內建變量NR 打印讀入內容的行編號

技術分享圖片

如果有多個文件,那麽awk默認會把所有內容看做一個文件


內建變量FNR 可以讓awk分別對每個文件進行處理

技術分享圖片

技術分享圖片


內建變量FILENAME 每處理一行就輸出內容所在文件的文件名

技術分享圖片

內建變量ARGC 命令行參數的個數 輸入的執行命令

技術分享圖片

2表示執行的命令中有兩個參數,更準確的說法是執行命令的字符串的個數是2:1、awk 2、/etc/issue


內建變量ARGV 這是個數組名,數組用來保存命令行中的參數

技術分享圖片


自定義變量

awk本身就是一個編程工具,所以它支持自定義變量,

技術分享圖片

這種變量賦值算一種提前賦值的方式,因為賦值的動作在執行命令之前。

技術分享圖片

這種變量賦值算另一種賦值方式,賦值的動作在執行命令過程中


printf

這個命令的主要功能就是對輸出內容進行制表操作,讓輸出的內容看起來更加美觀

printf FORMAT,item1,item2

註意:1、printf沒有默認格式,FORMAT必須給出。 2、printf不會自動換行,需要輸出換行符 3、FORMAT需要為後面每一個需要輸出的字段指定格式化符號(是以整數輸出,還是字符串輸出)

格式符:

%c 顯示為字符的ASCII碼

%d,%i 顯示為十進制整數

%f 顯示為浮點數

%g %G 以科學計數法或浮點形式顯示數值

%s 顯示字符串

%u顯示為無符號整數

%% 顯示%自身

技術分享圖片

printf 需要輸出的內容需要用雙引號引起來。

$1的內容需要用%s(字符串格式顯示)

現在換一個顯示格式

技術分享圖片

相同的內容,顯示格式不一樣,輸出就可能不一樣

為了讓輸出內容更有可讀性,我再改改

技術分享圖片

技術分享圖片

$1以%s的格式輸出,$3以%d的格式輸出,這是語法。


修飾符

#[.#] 第一個#號控制顯示的寬度,第二個#號表示小數點後的精度

技術分享圖片

%7s:默認表示右對齊,7表示$1輸出的字符串的長度,

技術分享圖片

%-7s:負號表示左對齊,如果有+號表示的不是右對齊,+號表示數值的正負屬性。

操作符

awk支持算術運算。

x+y加法 x-y減法 x*y 乘法 x/y 除法 x^y x%y余運算

-x 把數值變成負數

+x 把字符串轉換為數值

字符串操作符

沒有符號的操作符,表示字符串連接

賦值操作符

=

+= sum=sum+i sum+=i

-= sum=sum-I sum-=i

*= sum*=y sum=sum*y

/= sum/=y sum=sum/y

%= sum%=y sum=sum%y

^= sum^=y sum=sum^y

++i 是參與運算之前先讓i+1

i++ 是參與運算之後再讓i+1

- - 同理

比較操作符

> >= < <= != ==

模式匹配符

~ 左側的字符串是否被右側的模式(關鍵字)所匹配

!~ 左側的字符串是否不能被右側的模式(關鍵字)所匹配

邏輯操作符

&&

||

!

因為awk本身就是一個編程工具,所以其他編程工具有的功能,它基本都有


函數調用

內置函數rand ()

技術分享圖片

這裏不是要解釋rand()函數,而僅僅是演示函數的調用

內置函數length() 返回指定字符串的長度

內置函數split(s,a,[r]) 以r為分隔符切割s字符串,並將切割後的結果保存在a所表示的數組中。


條件表達式

selector?if-true-expression:if-false-expression

selector表達式是否為真,真的話執行true語句,假的話執行false語句


PATTERN

類似於地址定界的功能

1、empty 空模式 匹配任意行,全內容處理

2、/regular expression/ 使用正則表達式匹配文件中的行,僅處理匹配到的行

3、relational expression 關系表達式,結果有真 有假。結果為真才會被處理。真:結果為非0值,非空字符串為真,空字符串為假。

4、line ranges 行範圍 指定起始和結束行,可以使用匹配方式指定,還可以使用數字,不過要借用NR變量。

5、BEGIN\END

BEGIN{命令行}:僅在處理文件中的文本之前執行一次

END{命令行}:僅在處理文件中的文本之後執行一次


常用的action

1expressions awk自己的語句

2Control statements 比如 if while 控制語句

3Compound statements組合語句

4input statements 輸入語句

5output statements 輸出語句

控制語句

if(condition){statements}

if(condition){statements} else {statements}

while(condition){statements}

do{statements}while(condition)

for(expr1;expr2) {statements}

switch(expr1) {case VALUE1 or /REGEXP1/:statement;case VALUE2 or /REGEXP2/:statement;defaultstatement}

switch類似於case 多分支 可以匹配值也可以模式匹配

break [n] 跳出n層循環

continue 停止本輪循環,繼續下輪循環

next awk是對文件中的每一行進行處理,next是讓awk提前結束當前行的處理,繼續進行下一行的處理。

delete array[index]

delete array

exit

數組

array[index-expression]

index-expression

1、可使用任意字符串

2、如果某數組元素事先不存在,在引用時,awk會自動創建此元素,並將其值初始化為空串。

若要判斷數組中是否存在某元素,要使用”index in array”格式進行

Weekdays[“mon”]=”Monday”

若要遍歷數組中的元素,需要使用for循環


來練習練習

1、將用戶的ID做比較,UID大於1000的就是普通用戶,小於1000的就是系統管理員或者系統用戶

技術分享圖片

2、僅處理/etc/fstab中以UUID開頭的行

技術分享圖片

3、僅處理不以UUID開頭的行

技術分享圖片

4、將用戶ID作比較,UID大於1000的用戶顯示出來

技術分享圖片

5、將/etc/passwd中bash為/bin/bash的用戶顯示出來

技術分享圖片

技術分享圖片

6、顯示/etc/passwd的前10行的username和UID的行

技術分享圖片

技術分享圖片

技術分享圖片

7、第6個例子使用printf來做

技術分享圖片

8、第4個例子用awk if語句實現

技術分享圖片

9、練習if else語句

技術分享圖片

10、如果用戶的shell為/bin/bash,那麽就輸出用戶名

技術分享圖片

11、如果分區的使用率大於40,就顯示該分區

技術分享圖片

12、為指定行計算每一行的每一個字段的字符數

技術分享圖片

13、在第12個例子上加個難度。小於7個字符的字符串不需要輸出

技術分享圖片


Linux的awk命令簡單操作