awk是一個編程工具,他有完整的語法和命令。在bash中,awk更多的用於處理列內容(我是這麼認爲的,僅供參考)正則表達式
awk程序的執行邏輯shell
首先將文本內容讀入到內存中,根據字段分隔符,在讀取文本內容的過程當中把讀入的內容分段,第一個字段對應$1,第二個字段對應$2,依次類推,$0表明全部的字段。express
注意:編程
一、在awk程序中,變量的使用不須要帶$符號,由於$符號表示字段。數組
二、整個執行語句必須被'{}'包裹。bash
三、awk程序,在處理文本的時候是一次處理一行內容。ide
先簡單演示一下函數
這個例子中,awk程序將文本內容中的第二列和第四列進行了輸出。工具
這個例子主要是證實,awk每次處理一行內容。在例子中,awk處理了兩行內容,因此hello輸出的兩次。字段之間用逗號隔開。spa
這個例子中,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:一、awk 二、/etc/issue
內建變量ARGV 這是個數組名,數組用來保存命令行中的參數
自定義變量
awk自己就是一個編程工具,因此它支持自定義變量,
這種變量賦值算一種提早賦值的方式,由於賦值的動做在執行命令以前。
這種變量賦值算另外一種賦值方式,賦值的動做在執行命令過程當中
printf
這個命令的主要功能就是對輸出內容進行製表操做,讓輸出的內容看起來更加美觀
printf FORMAT,item1,item2
注意:一、printf沒有默認格式,FORMAT必須給出。 二、printf不會自動換行,須要輸出換行符 三、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
相似於地址定界的功能
一、empty 空模式 匹配任意行,全內容處理
二、/regular expression/ 使用正則表達式匹配文件中的行,僅處理匹配到的行
三、relational expression 關係表達式,結果有真 有假。結果爲真纔會被處理。真:結果爲非0值,非空字符串爲真,空字符串爲假。
四、line ranges 行範圍 指定起始和結束行,可使用匹配方式指定,還可使用數字,不過要借用NR變量。
五、BEGIN\END
BEGIN{命令行}:僅在處理文件中的文本以前執行一次
END{命令行}:僅在處理文件中的文本以後執行一次
經常使用的action
1、expressions awk本身的語句
2、Control statements 好比 if while 控制語句
3、Compound statements組合語句
4、input statements 輸入語句
5、output 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;default:statement}
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的就是系統管理員或者系統用戶
二、僅處理/etc/fstab中以UUID開頭的行
三、僅處理不以UUID開頭的行
四、將用戶ID做比較,UID大於1000的用戶顯示出來
五、將/etc/passwd中bash爲/bin/bash的用戶顯示出來
六、顯示/etc/passwd的前10行的username和UID的行
七、第6個例子使用printf來作
八、第4個例子用awk if語句實現
九、練習if else語句
十、若是用戶的shell爲/bin/bash,那麼就輸出用戶名
十一、若是分區的使用率大於40,就顯示該分區
十二、爲指定行計算每一行的每個字段的字符數
1三、在第12個例子上加個難度。小於7個字符的字符串不須要輸出
1四、使用for再寫第12例子
1五、輸出UID爲偶數的用戶信息
另外一個種方法,使用next命令,
1六、在awk中使用數組
1七、使用for遍歷數組
1八、統計端口監聽狀態的數量與種類
1九、統計/etc/fstab中文件系統類型出現的次數
20、統計/etc/fstab中單子的種類和個數
2一、統計創建鏈接的客戶端的IP及個數
經過多個管道把須要的內容先切割出來,其實能夠在特定的位置使用內建函數split