漫漫運維路——文本處理三劍客之awk基礎


awkgawk,是一款在Linux中實現文本格式化輸出的文本處理工具,在Linux中與文本過濾工具grep和文本行編輯器sed共同組成Linux中的文本處理三劍客。

awk在處理文本時以行爲單位,讀入整行數據後以指定的分隔符對行進行切片,然後再針對切片後的數據進行處理。如下圖所示:

 

wKioL1VggbKTc9pqAADdSymVeG4763.jpg

 

文本經過指定的分隔符進行切片後再對每一片進行處理,然後在根據設定的動作對處理後的文本執行動作,而切片後的文本如果只想引用一部分也可以使用變量進行引用,其引用的各個變量如下表所示:

變量

指代

$0$N

當前處理行的所有內容

$1,$2$3...

當前處理行切片後的第一、第二、第三...片內容

 

awk使用方式

1.awk命令行

#awk 

2.awk程序文件

awk -f /PATH/TO/awk_script_file

3.awk腳本

#/bin/awk -f

awk基本基本語法

awk  [OPTIONS] program FILE1 FILE2......

ProgramPATTERN{ACTION STATEMENT}

Program由語句組成,各語句之間使用;隔開

OPTIONS

-F:指定分隔符

例:顯示當前系統的各用戶名及其UID

[root@localhost tmp]# awk -F: '{print $1,$3}' /etc/passwd


-v:指定變量

例:使用awk定義一個變量,並顯示其值

[root@localhost tmp]# awk -v file=/etc/passwd BEGIN'{print file}'


/etc/passwd

-f:後接awk腳本文件

例:

awk內置變量:

變量

意義

變量

作用

FS

輸入分隔符

OFS

輸出分隔符

RS

行分隔符

NR

文件的行數(統一計數)

NF

當前行的字段數

FNR

文件的行數(單獨計數)

FILENAME

當前處理文件的文件名

ARGC

當前命令行參數的個數

ARGV

以數組方式保存命令行參數個數



變量的幾個使用實例

1:使用多種字符作爲輸入分隔符


wKiom1VggFuAneKVAAE-LWmJ0XA314.jpg

 

2:使用不同的輸出分隔符


wKiom1VggHLBNJW1AACgOBOxha8800.jpg

 


3:使用“,”作爲行分隔符


wKioL1VgghnQxwiFAACONKdJ_fs161.jpg

 


4:查看當前文件每行的字段數


wKioL1VggjeQYqLFAAD3ceUjDhU668.jpg

 


5:使用分別計數和統一計數顯示當前處理的文件和正處理的行數,並顯示其文件名


wKiom1VggNXz32yGAAD0urQWyHM299.jpg

 


6:顯示當前命令的參數個數

[root@localhost tmp]# awk 'BEGIN{print ARGC}'
1


ACTIONprintprintf

EXPRESSIONS:表達式

Control Statements:控制語句

if condition{statements} [else {statement}]

例:打印指定文件的行,條件爲其字段數必須大於三


wKioL1VggpWgUeavAACpJLelme0135.jpg

 

while (condition) {statements}

例:顯示指定文件中單詞長度大於5的字符串


wKiom1VggV_QCuN6AACpOp2L9Qc463.jpg


do statement while condition) 

for expr1expr2expr3{statements}

for var in array{statements}:遍歷數組array中的元素

break 

語法:break [n]:表示退出n輪循環

continue 

exit [expression]

{statements}

next:執行next會跳過當前動作,進入下一輪

例:找出當前系統上所有UID爲偶數的用戶,並顯示其用戶名和UID


wKiom1VggYizCYdZAACudb2x3fE893.jpg

  

Compound Statements:複合語句

Input statements:輸入語句

Output statements:輸出語句

print:直接打印輸出內容,會自動換行,上面已經有例子

print item1item2... 

printf:格式化打印輸出指定內容,不會自動換行

printf  FORMAT [修飾符]item1item2,......

FORMAT

%c:只顯示字符的ASCII

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

%f:顯示浮點數

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

%s:顯示字符串

%u:顯示無符號整數

%%:顯示%本身

修飾符:

#[#]

+:顯示數值符號

-:左對齊

格式化輸出的一個實例

例:格式化輸出當前系統的用戶和其ID

[root@localhost tmp]# awk -F":" '{printf "%s\n %s %15-s %s %2-4s %s\n","---------------------------","|",$1,"|",$3,"|"}' /etc/passwd


wKioL1Vgg9WBSyxbAAEAhqPtUHA703.jpg


awk中的操作符

算數操作符:

操作符

意義

操作符

意義

x+y

xy

-x

表示x是個負值

x-y

xy

x%y

xy取模

x*y

xy

x^y

xy次方

x/y

xy



例:定義兩個變量,計算兩個變量的和

[root@localhost tmp]# awk -v f1=2 -v f2=3 'BEGIN{print f1+f2}'

字符操作符:

字符連接,可直接寫,不使用其他符號,

賦值操作符:

操作符

意義

操作符

意義

=

直接賦值

%=

取模後賦值

+=

加後賦值

^=

次方後賦值

-=

減後賦值

--

自減1後賦值

*=

乘後賦值

++

自加1後賦值

/=

除後賦值



例:定義一個變量,然後對變量進行自加後打印出來

[root@localhost tmp]# awk -v test=1 'BEGIN{test++;print test}'


比較操作符:

操作符

意義

>

前面變量是否大於後面變量

>=

前面變量是否大於或者等於後面變量

<

前面變量是否小於後面變量

<=

前面變量是否小於或等於後面變量

==

比較前後兩個變量是否等值

!=

比較前後連個變量是否不等

例:定義兩個變量並賦值,判斷其是否相等

[root@localhost tmp]# awk -v f1=2 -v f2=3 'BEGIN{print f1==f2}'
1


 模式匹配操作符

操作符

意義

~

是否能被右側模式所匹配

~

是否不能被右側模式所匹配

例:查看當前系統上所有用戶的用戶名有哪些是以r開頭的

[root@localhost tmp]# awk -F: '{print "user:"$1,"T/F:",$1~/^r.*/}' /etc/passwd


wKiom1Vggv-xvav_AAFMmJXm48Y476.jpg

 

邏輯操作符

操作符

意義

&&

與運算

||

或運算

非運算

 

例:判斷給定文件中是否包含root字符串或第一和第二個字符串是否爲都爲tom,1爲是,0爲否

[root@localhost tmp]# awk -F" " '{print NR,($1=="root" || $2=="root" ||$1==$2 && $1=="tom") }' awk


wKioL1VghLXRoWX-AADFCgeJOiM292.jpg

 

條件表達式:

selectorIf-ture-expressionif-false-expression

例:判斷當前系統上的各個賬號的類型(系統賬號和普通賬號)

[root@localhost tmp]# awk -F: '$3<500?utype="system user":utype="common user"{print $1,":",utype}' /etc/passwd


wKioL1VghdiwlG2pAAFWGAxo6mw999.jpg

 

函數調用:

function_nameargu1argu2...

常見內建函數

land():返回0,1隨機數

length():取字符串長度

subrs[t]):基於r所表示的模式來匹配字符串t中的內容,將其第一次被匹配到的內容替換爲s所表示的字符串

gsubrs[t]):同上,只不過是全局替換

split(ra[r]):以r爲分隔符取切割字符串s,並將切割後的結果保存至a所表示的數組中

substrsin):從s所表示的字符串取子串,取法:從i表示的位置開始,取n個字符

systime():取當前系統的時間戳

用戶自定義函數

Function f_namep,q{...}

 

PATTERN

空模式:匹配文本中的所有行

/Regular Expression/:僅將ACTION應用於Regular Expression所匹配到的行

例:顯示/etc/passwd文件中包含root字符串行的相關信息

[root@localhost tmp]# awk '/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin


關係表達式:結果爲真時才執行

例:找出/etc/passwd文件中的普通用戶,並打印輸出

[root@localhost tmp]# awk -F: '$3>=500{print $1,$3}' /etc/passwd
wuxiaotao 500
wxt 501


行定界:start_linestop_line

BEGIN:在文件格式化操作之前實現執行的一次操作

例:打印歡迎信息

[root@localhost tmp]# awk 'BEGIN{print "hello welcome!"}'


END:在文件格式化操作完成後,命令退出之前執行的一次操作

例:處理完文件後提示文件已經處理完了

[root@localhost tmp]# awk -F: '$3>=500{print $1,$3}END{print "The End"}' /etc/passwd
wuxiaotao 500
wxt 501
The End


數組:

關聯數組:array[index-expression]

Index-expression

可以使用任意字符

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

例:統計給定文件中各個單詞的出現次數

[root@localhost tmp]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(j in count){print j,count[j]}}' awk 


wKioL1VghaHB87OYAAEQp1oANx0575.jpg

 

例:查看當前tcp協議的各種狀態的個數

[root@localhost tmp]# ss -tan | awk '!/state/{state[$1]++}END{for(i in state)print i,state[i]}'

wKiom1Vgg_ijqi2gAAChA7ZKecY934.jpg

 

例:統計當前服務器上各個ip訪問的次數

[root@localhost tmp]# awk '{ip[$1]++}END{for(i in ip)print i,ip[i]}' /var/log/httpd/access_log

 差不多就這樣吧,內容太多了,很多格式也不統一,有些都是上課跟着老師做的筆記。慚愧!

 

 

 

 

 

 

 

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章