Linux自學筆記——awk文字處理工具
GUN awk:
文字處理三劍客:grep,sed,awk
grep,egrep,fgrep:文字過濾工具:pattern
sed:行編輯器
模式空間、保持空間
awk:Aho,Weinberger,Kernighan –-> New AWK,NAWK
GNU awk,gawk
下面一起來看看awk的基本語法及具體應用;
gawk – pattern scanning andprocessing language
基本用法:gawk [option]‘program’FILE…
program:PATTERN{ACTION STATEMENTS}
語句之間用分號分隔
print,printf
-F:指明輸入時用到的欄位分隔符;
-v var=value:自定義變數;
1.print
print item1,item2,…
要點:
1)逗號分隔符;
2)輸出的各item可以字串,也可以是數值;當前記錄的欄位、變數或awk的表示式;
3)如省略item,相當於print $0;
2.變數
2.1內建變數
FS:input field separator,預設為空白字元;
OFS:output field seperator,預設為空白字元;
RS:input record separator,輸入時的換行符;
ORS:output record separator,輸出時的換行符;
NF:number of field,欄位數量
{print NF},{print $NF}
NR:number of record,行數;
FNR:各檔案分別計數;行數;
FILENAME:當前檔名;
ARGC:命令列引數的個數;
ARGV:陣列,儲存的命令列所給定的各引數;
2.2自定義變數
1) –v var=value
變數名區分字元大小寫;
2) 在program中直接定義
3.printf命令
格式化輸出:printf FORMAT,item1,item2,…
1)FORMAT必須給出;
2)不會自動換行,需要顯式給出換行控制符,\n
3)FORMAT中需要分別為後面的每個item指定一個格式化符號;
格式符:
%c:顯示字元的ASCII碼;
%d,%i:顯示十進位制整數;
%e,%E:科學計數法數值顯示;
%f:顯示為浮點數;
%g,%G:以科學計數法或浮點形式顯示數值;
%s:顯示字串;
%u:無符號整數;
%%:顯示%自身
修飾符:
#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點後的精度;例如:%3.1f
-:左對齊
+:顯示數值的符號
4.操作符
算術操作符
X+y,x-y,x*y,x/y,x^y,x%y
+x:轉換為數值
字串操作符:沒有符號的操作符,字串連線
賦值操作符:
+,+=,-=,*=,/=,%=,^=
++,--
比較操作符:
>,>=,<,<=,!=,==
模式匹配符:
~:是否匹配
!~:是否不匹配
邏輯操作符:
&&
||
!
函式呼叫:
function_name(arg1,arg2,…)
條件表示式:
selector?if-true-expression:if-false-expression
5.PATTERN
1)empty:空模式,匹配每一行;
2)/regular expression/:僅處理能夠被此處的模式匹配到的行;
3)relation1 expression:關係表示式;結果有真有假;結果為真才會被處理;
真:結果為非0值,非空字串;
4)line ranges:行範圍,startline,endline:/pat1/,/pat2/
注意:不支援直接給出數字的格式
示例:列印/etc/passwd裡的第2到第10個使用者
5)BEGIN/END模式
BEGIN{}:僅在開始處理檔案中的文字之前執行一次;
END{}:僅在文字處理完成之後執行一次;
6.常用的action
1)expressions
2)control statements:if,while等;
3)compound statements:組合語句;
4)input statements
5)output statements
7.控制語句
if(condition) {statements}
if(condition) {statements} else {statements}
while(condition) {statements}
do {statements} while(condition)
for(expr1;expr2;expr3) {statements}
break
continue
delete array[index]
delete array
exit
{ statements }
7.1 if-else
語法:if(condition) statement[else statement]
示例1:將系統中的所有使用者分類,id號大於1000的打印出普通使用者,否則打印出root或系統使用者;
示例2:打印出使用bash的使用者;
示例3:打印出欄位大於5的行
示例4:打印出磁碟用量超過百分之20的磁碟
使用場景:對awk取得的整行或某個欄位做條件判斷;
7.2 while迴圈
語法:while(condition) statement
條件“真”,進入迴圈;條件“假”,退出迴圈;
使用場景:對一行內的多個欄位逐一類似處理時使用;對陣列中的各元素逐一處理時使用;
示例:從/etc/grub.conf檔案中取出,以任意空格開頭,後面緊跟kernel的行,並將其欄位大於7的欄位和欄位的字元數打印出來;
7.3 do-while迴圈
語法:do statement while(condition)
意義:至少執行一次迴圈體
7.4 for迴圈
語法:for(expr1;expr2;expr3) statement
for(variable assignment;condition;iteration process) {for-body}
特殊用法;
能夠遍歷陣列中的元素:
語法:for(var in array) {for-body}
7.5 switch語句
語法:switch(expression) {case VALUE1 or /REGEXP/:statement;case VALUE2 or /REGEXP2/:statement;…;default:statement}
7.6 break和continue
break[n]
continue
7.7 next
提前結束對本行的處理而直接進入下一行;
示例:列印/etc/passwd偶數行
8. array
關聯陣列:array[index-expression]
Index-expression:
1)可使用任意字串;字串要使用雙引號;
2)如果某陣列元素事先不存在,在引用時,awk會自動建立此元素,並將其值初始化為“空串”
若要判斷陣列中是否存在某元素,要使用“index in array”格式進行;
weekdays[mon]="Monday"
若要遍歷陣列中的每個元素,要使用for迴圈:
for(var in array) {for-body}
示例:列印陣列元素:
注意:var會遍歷array的每個索引;
state[“LISTEN”]++
state[“ESTABLISHED”]++
示例:統計tcp協議狀態及相應個數:
練習1:統計/etc/fstab檔案中每個檔案系統型別出現的字數;
練習2:統計指定檔案中每個單詞出現的次數;
9.函式
9.1內建函式
數值處理:
rand():返回0和1之間的一個隨機數;
字串處理:
length([s]):返回指定字串的長度;
sub(r,s,[t]):以r表示的模式來查詢t所表示的字元中的匹配的內容,並將其第一次出現替換為s所表示的內容;
gsub(r,s,[t]):以r表示的模式來查詢t所表示的字元中的匹配的內容,並將其所有出現均替換為s所表示的內容;
split(s,a[,r]):以r為分隔符切割字元s,並將切割後的結果儲存至a所表示的陣列中;
轉載於:https://blog.51cto.com/claude666/1970930