awk用法進階

一、控制語句

1 if-else語句

       使用場景:對awk取得的整行或某個字段做條件判斷

       語法:

              if(condition) statement [else statement]

              if(condition1){statement1}else if(condition2){statement 2}else{statement3}

例:判斷uid是否大于等于500,是則為普通用戶,否則為root或系統用戶

]#awk -F: '{if($3>=500){printf "Common User: %-15s,uid %d\n",$1,$3} else {printf "Root or Sysuser: %-15s,uid %i\n",$1,$3}}' /etc/passwd

blob.png

例:取id為偶數的用戶名及UID

blob.png

例:取出shell為bash的用戶

blob.png

例:判斷磁盤的利用率,大于20則給出警告。

]#df -Th |awk -F[%] '/^\/dev\/(sd|ma).*/{print $1}' |awk '{if($NF>=20){printf "Warning,%s usage has %d\n",$1,$NF} }'

blob.png

2 while循環語句

       語法:while(condition) {statements}

              條件為真,進入循環;條件為假,退出循環

       使用場景:對一行內的多個字段逐一進行類似處理時使用,對數組中的元素逐一處理時使用

例:統計/etc/grub2.cfg文件中以linux16(前面可跟任意個空格)開頭的行的每一個單詞的字符數

]#awk '/^[[:space:]]*linux16/{num=1;while(num<=NF){print $num,length($num);num++}}' /etc/grub2.cfg

blob.png

例:在上一個例子的基礎上,只顯示字符數大于等于7的單詞。

]#awk '/^[[:space:]]*linux16/{n=1;while(n<=NF){if(length($n)>=7){print $n,length($n)}n++}}' /etc/grub2.cfg

blob.png

3 do-while循環語句

       語法:do statement while(condition)

       無論判斷條件為真或假,至少執行一次循環體

]#awk '{do{print "I am the King! "} while($1=="King")}' /etc/passwd

blob.png

4 for循環語句

       語法:for(expr1;expr2;expr3)  {statements}

                for(變量賦值;條件;變量修正)

例:使用for循環實現統計/etc/grub2.cfg文件中以linux16(前面可跟任意個空格)開頭的行的每一個單詞的字符數,并只顯示字符數大于等于7的

]#awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++){if(length($i)>=7){print $i,length($i)}}}' /etc/grub2.cfg

blob.png

       for的特殊用法:

              能夠遍歷數組中的元素:for(var in array) {for-body}

例:

awk 'BEGIN{test["1st"]="First";test["2nd"]="Second";for(a in test){print test[a]}}'

blob.png

5 switch語句

       語法:switch(expression) {case VALUE1 or /REGEXP1/:statement1;case VALUE2 or /REGEXP2/:statement2;….;default:statement}

例: 

]#awk '{switch($3) { case "xfs":print "i am xfs" ; case "ext4":print "i am ext4";default : print "unknown"; }}' /etc/fstab

blob.png

注:switch語句在CentOS7系列中使用正常,在6中使用會報錯誤提示。

6 break&continue

break [n]用于退出循環體,不再執行循環。

       在for循環中使用

blob.png

       在while循環中使用

blob.png

continue用于退出當次循環,continue后面的循環體不再運行,而是直接進入下一次循環。只能用在for循環體中。

blob.png

continue用在while循環中,不能正確退出

blob.png

7 next

       用于控制awk的內生循環,提前結束對當前行的處理,直接進入下一行。

例:取出id號為奇數的用戶名

]#awk -F: '{if($3%2==0){next}else{print $1,$3}}' /etc/passwd

blob.png

8、數組

在awk中,所有數組都是關聯數組。

關聯數組:array[index-expression]

       index-expression

       1)可使用任意字符串,字符串要使用雙引號””

       2)如果某數組元素事先不存在,在引用時,awk會自動創建次元素,并將其值初始化為“空串”

       若要判斷在數組中是否存在某元素,要使用“index in array”格式進行。

       若要遍歷數組中的每一個元素,需要使用for循環

       for(var in array){for-body}

       注意:var的值為數組的下標

例:分別統計網絡連接中的LISTEN、ESTABLISHED狀態的連接數

netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state){print i,state[i]}}'

blob.png

ss -tan |awk '/^[LE]/{state[$1]++}END{for(i in state){print i,state[i]}}'

 blob.png

例:

(1)統計/etc/fstab文件中每個文件類型出現的次數

cat /etc/fstab | awk '!/^#/&&!/^$/{fstype[$3]++}END{for(i in fstype){print i,fstype[i]}}'

blob.png

(2)統計指定文件中每個單詞出現的次數

cat /etc/fstab | awk -F[" "=/,"\t"] '{for(i=1;i<=NF;i++){word[$i]++}}END{for(n in word){print n,word[n]}}'

blob.png

二、函數

內置函數

自定義函數

1、內置函數

數值處理

       rand():返回0和1之間的一個隨機數

字符串處理

       length([s]):返回指定字符串的長度。

       split(s,a[,r]):以r為分隔符切割s,并將切割后的結果保存至a所表示的屬組中

       其數組下標從1開始

例:統計遠程連接到當前主機的ip數

netstat -tan | awk '/^tcp\>/{split($5,ip,":");ip_count[ip[1]]++}END{for(i in ip_count) print i,ip_count[i]}'

blob.png

       sub(r,s,[t]) :對t 字符串進行搜索r 表示的模式匹配的內容,并將第一個匹

配的內容替換為s。

例:將/etc/passwd中root用戶的用戶名替換為superman

blob.png

將/etc/fstab中ext4的文件類型替換為xfs

blob.png

       gsub(r,s,[t]) :對t 字符串進行搜索r 表示的模式匹配的內容,并全部替換

為s。

blob.png

2、自定義函數

格式:

function name ( parameter, parameter, … ) {

       statements

       return expression

}

原創文章,作者:M20-1鐘明波,如若轉載,請注明出處:http://www.www58058.com/48231

(1)
M20-1鐘明波M20-1鐘明波
上一篇 2016-09-21 14:03
下一篇 2016-09-21 14:49

相關推薦

  • Linux三劍客之sed

    sed:全稱stream EDit 行文本編輯器 作用:是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在模式空間,接著用 sed命令處理緩沖區中的內容,處理完成后,把模式空間的內容輸出到標準輸出。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。 Sed主要用來自動編輯一個或多個文件,簡化對文件的反復操…

    Linux干貨 2016-08-12
  • linux 文件管理命令

    cp 復制文件或者路徑 單源復制: cp [OPTION]…[-T] SOUTCE DEST 如果DEST不存在:則事先創建此文件,并復制源文件的數據流到DEST中 如果DEST存在:   如果DEST是非目錄文件:則覆蓋目標文件; 如果DEST是目錄,就在這個目錄中創建一個同名的文件,把源數據復制到這個文件中。 多源復制: cp [O…

    Linux干貨 2017-08-28
  • MySQL系列之一鍵安裝腳本—-單實例/多實例

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1440414       最近在搞MySQL,由于經常測試一些東西。因此,就寫了一個一鍵安裝腳本。 腳本用途: 用于在…

    Linux干貨 2016-08-15
  • OpenSSH

    ssh: secure shell, protocol, 22/tcp, 安全的遠程登錄 OpenSSH: ssh協議的開源實現; dropbear:另一個開源實現;  SSH協議版本 v1: 基于CRC-32做MAC,不安全;man-in-middle v2:雙方主機協議選擇安全的MAC方式 基于DH算法做密鑰交換,基于RSA或DSA算法實現身份…

    Linux干貨 2015-06-21
  • 細說CP使用

    cp詳細用法和常用選項

    Linux干貨 2017-11-26
  • Linux文件系統

    1、Linux文件系統層級標準 為什么Linux的不同發行版中的目錄結構基本上都一樣? Linux有一個組織叫LSB定義的Linux發行版基礎目錄名稱命名法則及功用規定,這種標準叫做 FHS(Filesystem Hierarchy Standard),文件系統層級標準。 /boot:系統引導啟動時要加載的靜態文件:kernel, initramfs(ini…

    Linux干貨 2016-10-29
欧美性久久久久