Linux的awk命令簡單操做

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

awk程序的執行邏輯shell

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

注意:編程

      一、在awk程序中,變量的使用不須要帶$符號,由於$符號表示字段。數組

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

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


先簡單演示一下函數

圖片.png

圖片.png

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

圖片.png

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

圖片.png

這個例子中,hello與$2之間沒有逗號,因此輸出的內容中hello與$2所表明的的內容連在一塊兒。

圖片.png

這個例子中print後面沒有跟任何參數,因此這個例子證實,print默認是輸出全部內容


選項:

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

圖片.png

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


變量

若是要使用變量就要使用-v這個選項

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

圖片.png


內建變量 OFS awk在輸出時默認使用空白字符做爲分隔符,也能夠經過OFS進行指定



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


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

圖片.png

本來一行的內容被拆分紅了若干行


內建變量ORS,awk在輸出內容時默認使用\n做爲換行符,也能夠進行改變

圖片.png

圖片.png

這個例子中,須要注意的是每個變量以前必須有一個-v的選項,否則系統會報錯。

本來須要換行的輸出,因爲換行符改成#號,因此#號代替了換行。


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

圖片.png

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

圖片.png

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


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

圖片.png

若是有多個文件,那麼awk默認會把全部內容看作一個文件


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

圖片.png

圖片.png


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

圖片.png

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

圖片.png

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


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

圖片.png


自定義變量

awk自己就是一個編程工具,因此它支持自定義變量,

圖片.png

這種變量賦值算一種提早賦值的方式,由於賦值的動做在執行命令以前。

圖片.png

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


printf

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

printf FORMAT,item1,item2

注意:一、printf沒有默認格式,FORMAT必須給出。 二、printf不會自動換行,須要輸出換行符 三、FORMAT須要爲後面每個須要輸出的字段指定格式化符號(是以整數輸出,仍是字符串輸出)

格式符:

           %c 顯示爲字符的ASCII碼

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

           %f 顯示爲浮點數

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

           %s 顯示字符串

           %u顯示爲無符號整數

           %% 顯示%自身

圖片.png

printf 須要輸出的內容須要用雙引號引發來。

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

如今換一個顯示格式

圖片.png

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

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

圖片.png

圖片.png

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


修飾符

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

圖片.png

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

圖片.png

%-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 ()

圖片.png

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

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

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


條件表達式

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

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


PATTERN

相似於地址定界的功能

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

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

三、relational expression 關係表達式,結果有真 有假。結果爲真纔會被處理。真:結果爲非0值,非空字符串爲真,空字符串爲假。

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

五、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循環


來練習練習

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

圖片.png

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

圖片.png

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

圖片.png

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

圖片.png

五、將/etc/passwd中bash爲/bin/bash的用戶顯示出來

圖片.png

圖片.png

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

圖片.png

圖片.png

圖片.png

七、第6個例子使用printf來作

圖片.png

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

圖片.png

九、練習if  else語句

圖片.png

十、若是用戶的shell爲/bin/bash,那麼就輸出用戶名

圖片.png

十一、若是分區的使用率大於40,就顯示該分區

圖片.png

十二、爲指定行計算每一行的每個字段的字符數

圖片.png

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

圖片.png

1四、使用for再寫第12例子

圖片.png

1五、輸出UID爲偶數的用戶信息

圖片.png

另外一個種方法,使用next命令,

圖片.png

1六、在awk中使用數組

圖片.png

1七、使用for遍歷數組

圖片.png

1八、統計端口監聽狀態的數量與種類

圖片.png

1九、統計/etc/fstab中文件系統類型出現的次數

圖片.png


20、統計/etc/fstab中單子的種類和個數

圖片.png

2一、統計創建鏈接的客戶端的IP及個數

圖片.png

經過多個管道把須要的內容先切割出來,其實能夠在特定的位置使用內建函數split

圖片.png

相關文章
相關標籤/搜索