Linux的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
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循環
來練習練習
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命令簡單操作