awk的進階

前言

awk的中有很多的控制語句,awk也支持if語句,while語句,for語句等等編程邏輯充的控制語句及數組、函數。

awk的進階無非就是多練。

1.控制語句

(1)if-else語句

語句格式: if(condition) {statments}    if  (條件) 條件為真 執行{statments}

只有一個語句可以省略{}。組合語句必須加{}if(condition) {statments} else {statements}雙分支語句     if(條件)為真時執行{statments} else否則執行{statrments}

例:顯示系統上某個用戶的ID號大于1000,這是普通用戶,反之則為系統用戶

~]# awk  -F:  '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd

(提示:  -F: 是以:為分隔符     $3/etc/passwd 是第三段      printf 格式化輸出     $1/etc/passwd 的第一段    另外這是空模式是每一行都讀取的)

87bb3ed5-1473-42be-8794-d4fea51e022e.png

例   顯示shell為/bin/bash的用戶  

~]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd

  (   提示NF是字段數   -F:分隔符:)

265bbfa1-6b88-40ce-84e6-9f44f7e0a9b5.png

顯示/etc/fstab 的一行字段數大于五個 ,否則不顯示

~]# awk '{if(NF>5) print $0}' /etc/fstab

(提示:NF是字段數    $本身 也就是取過來的行整行)

ddd5de5b-5ba0-4dfa-a0d4-34a7eff78ce0.png

顯示磁盤使用的使用率到5%的分區。

~]# df -h | awk -F[%] '/^\/dev/{print $1}' | awk '{if($NF>=5) print $1}'

  (提示: -F[%]是以空格分隔   /^\/dev/ 是以/dev/開頭 也就是地址定界。     $NF是取末尾的字段數)   

956b120d-d125-459f-afce-af2cc4fb8e22.png

對awk取得的整行或某個字段做條件判斷;

(2) while循環

語法:while(condition) statement

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

while(conditon) {statments} 只有一個語句可以省略{}。組合語句必須加{}

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

  顯示每一個符合條件的行,行內的每一個字段,字段本身和字段的個數。條件(統計/etc/grub,conf  以空白開頭后跟kernel的行)

 awk '/^[[:space:]]*kernel/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub.conf 

 (提示: /^[[::space:]]*kernel/  以有多個空白的行后跟kernel做地址定界   i=1:知道變量i=1 i<=NF是判斷有多少個字段數 NF是字段數,print $i 是顯示第幾個字段數 , length()內建函數 :返回指定字符串的長度; i++自加 不然都是1了

cea8bba2-01b5-436f-8be1-f51f9b4eae00.png

把字符數小于7的不予顯示

awk '/^[[:space:]]*kernel/{i=1;while(i<=NF) {if(length($i)>=7){print $i,length($i)}; i++}}' /etc/grub.conf 

(3)do-while循環

語法:do statement while(condition)

意義:不管是真是假先執行一遍。至少執行一次循環體

(4) for循環

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

                                expr1  初始化;expr2條件判斷;expr3控制變量不斷的修正

                                 for(variable assignment;condition;iteration process) {for-body}

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

顯示每一個符合條件的行,行內的每一個字段,字段本身和字段的個數。條件(統計/etc/grub,conf  以空白開頭后跟kernel的行)(跟上面差不多 ,只不過是采用for循環)

                         

cd9c4964-f7dc-44da-a15b-45e8dc02e0f0.png

特殊用法:

能夠遍歷數組中的元素;

語法:for(var in array) {for-body}

(5) switch語句

語法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}

    這個語法意思: 表達式: case  value1 值跟表達式匹配  或者是  正則表達式跟表達式匹配。則顯示statment 。。。。。。。默認用default:statement

        

(6) break和continue

break [n]  跳出N層循環

continue  退出本次循環

   

(7)next

提前結束對本行的處理而直接進入下一行;這是跟break不一樣的 ,next直接進入下一行的,break是進入下一字段的。

                                   顯示ID為偶數的用戶

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

                      (提示  $3%2!=0   next ID號不等于0  直接跳入下一行  )

 

e94e1d0d-84dc-4cb6-8dee-d717d8aa4e79.png

2.array(數組)

關聯數組:array[index-expression]在awk 使用最多

                                index-expression:

                       delete array[index]  從數組中刪除某個元素

delete array   刪除整個數組

(1) 可使用任意字符串;字符串要使用雙引號;

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

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

                                                                             weekdays[mon]="Monday"

                   例:              awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}

                                          它會顯示那個呢;  你在去掉mon  和tue的雙引號  看看會怎么言   

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

for(var in array) {for-body}

  例:awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'

                   (提示: 定義一個數組weekdays )

       

532b2d50-6dd3-4c51-8d94-bbdf94479c59.png

注意:var會遍歷array的每個索引;

state["LISTEN"]++

state["ESTABLISHED"]++

                                         顯示netstat -tan 的以tcp開頭的狀態,并做統計     

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

                                           (提示:  '/tcp\>/做地址定界, state[]數組 )

a2813579-c704-41fa-a71e-ecf6230cbbed.png

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

練習1:統計/etc/fstab文件中每個文件系統類型出現的次數;

~]# awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab

                                           (提示:‘/^UUID’地址定界    fs[]數組 )

2448ba63-b264-4c17-b01a-59f78e21670d.png

練習2:統計指定文件中每個單詞出現的次數;

~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab

                                                 (提示 :count[]是數組 )

f0f541bd-4e2c-4a9b-a481-a18170aa5739.png

3.函數

(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所表示的數組中;


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

  

92cce50f-6696-40cc-9ada-e2b237ab88e8.png

           

(2)自定義函數

想加強sed和awk可以看《sed和awk》

原創文章,作者:N19_king,如若轉載,請注明出處:http://www.www58058.com/20275

(0)
N19_kingN19_king
上一篇 2016-06-24 21:31
下一篇 2016-06-26 09:23

相關推薦

  • Docker之~集群配置

    一、前言 Kubernetes 是Google開源的容器集群管理系統,基于Docker構建一個容器的調度服務,提供資源調度、均衡容災、服務注冊、動態擴縮容等功能套件,目前最新版本為0.6.2。 本文介紹如何基于Centos7.0構建Kubernetes平臺,在正式介紹之前,大家有必要先理解Kubernetes幾個核心概念及其承擔的功能。以下為Kubernet…

    2015-03-23
  • 馬哥教育21期網絡班—第14周課程+練習——>iptables 練習

    系統的INPUT和OUTPUT默認策略為DROP; iptables -P INPUT DROP iptables -P OUTPUT DROP [root@localhost ~]# iptables -L -n  Chain INPUT…

    Linux干貨 2016-10-24
  • Hadoop hdfs 分布式文件系統

    Hadoop簡介:一個分布式系統基礎架構,由Apache基金會開發。用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力高速運算和存儲。Hadoop實現了一個分布式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有著高容錯性的特點,并且設計用來部署在低廉的(low-cost)硬件…

    Linux干貨 2015-08-05
  • 包管理之包查詢,包校驗,rpm數據庫.yum的詳細用法及說明

    一.概述 包查詢 rpm {-q|–query} [select-options] [query-options] [select-options] -a: 所有包 -f: 查看指定的文件由哪個程序包安裝生成 -p rpmfile:針對尚未安裝的程序包文件做查詢操作; –whatprovides CAPABILITY:查詢指定的CAP…

    Linux干貨 2016-08-30
  • Nginx淺談(一)

    淺談nginx(一) 此文主要介紹nginx的基礎知識及其基本配置,一為鞏固,二為記錄 知識點: nginx的作用 nginx的基本配置框架 nginx一些常用模塊介紹 1、什么是nginx     nginx是一款免費的,開源的,高性能的HTTP服務軟件,它不僅能     夠支…

    Linux干貨 2017-01-15
  • 配置Nginx作為反向代理服務器

    配置Nginx作為反向代理服務器      一、nginx作為反向代理的工作模型: 1、nginx作為反向代理的工作模型       nginx工作在應用層,其能理解并可以提取出http請求報文中的首部信息中的請求方法、url、http協議版本等信息。   &…

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