linux三劍客之awk

awk

   
   
    簡介:是一個優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一。這種編程及數據操作語言的最大功能
          取決于一個人所擁有的知識。awk經過改進生成的新的版本nawk,gawk,現在默認linux系統下日常使用的是gawk,用命令可以查
          看正在應用的awk的來源(ls -l /bin/awk )
    名稱由來:三位作者名字的首字母,Aho, Weinberger, Kernighan
    格式:
        awk [options] ‘program’ var=value file…
        awk [options] - f programfile var=value file…
        awk [options] 'BEGIN{ action;… } pattern{ action;… } END{action;… }' file ...
     awk通常組成:
         BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊
         program通常是被單引號或雙引號中
    常用選項
        -F:指定分割符,默認為空白分隔符
        -v:定義變量,每個變量前添加-v
      
    基本格式:awk [options] 'program' file…
      
       program組成:patter{action}兩個部分組成
           patter:決定動作的何時觸發和觸發事件
           (BEGIN,END)
          action對數據進行處理,放在{}內指明
          ( print, printf)
          
    分割符、域和記錄
    ? awk執行時, 由分隔符分隔的字段(域)標記$1,$2..$n稱為域標識。 $0為所有域,注意:和shell中變量$符含義不同
    ? 文件的每一行稱為記錄
    ? 省略action,則默認執行 print $0 的操作。
    
    工作原理
        第一步:執行BEGIN{action;… }語句塊中的語句
        第二步:從文件或標準輸入(stdin)讀取一行,然后執行pattern{action;… }語句塊,它逐行掃描文件,從第一行到最后一行重
        復這個過程,直到文件全部被讀取完畢。
        第三步:當讀至輸入流末尾時,執行END{action;…}語句塊
        BEGIN:語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常
            可以寫在BEGIN語句塊中
        END:語句塊在awk從輸入流中讀取完所有的行之后即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它
            也是一個可選語句塊
      pattern:語句塊中的通用命令是最重要的部分,也是可選的。如果沒有提供pattern語句塊,則默認執行{ print },即打印每一個讀取
              到的行, awk讀取的每一行都會執行該語句塊
     
       action動作
           print格式:print item1,item2
           (1)用逗號隔開,輸入結果以空格分割
          (2)item的值可以是字符串(用雙引號引起來)、變量、當前記錄(行)的字段、數值、awk表達式
          (3)如果不寫item默認打印$0
          
       awk 變量
           內置變量:
           FS:指定字段的分隔符,默認為空格
               awk -v FS=":" '{print $1}' file
               awk  -F  ":"  '{print $1}' file
           OFS:輸出字段的分隔符,默認的為空白
               awk - v FS=‘:’ - v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd
           RS:輸入記錄分隔符, 指定輸入時的換行符,原換行符仍有效
            awk -v RS=' ' ‘{print }’ /etc/passwd
           NF:字段數量
               awk  -F: '{print NF}' /etc/passwd
             NR:行號(多個文件時,將不單獨統計每個文件的行號)
               awk  '{print NR,$0}' /etc/passwd
           FNR:分別顯示每個文件的行號
               awk    '{print FNR,$0}' /etc/passwd /etc/fstab
            
           FILENAME:當前文件名
               awk '{print FILENAME}’ /etc/fstab 
                       
            ARGV:數組,保存的是命令行所給定的各參數
                awk ‘BEGIN {print ARGV[0]}’ /etc/fstab
        自動變量:
            (1) - v var=value
              變量名區分字符大小寫             
            (2) 在program中直接定義
             awk - v test='hello gawk' '{print test}' /etc/fstab  :/etc/fstab有幾行將會打印出幾行‘hellow gawk’
                         awk - v test='hello gawk' 'BEGIN{print test}'
                         awk 'BEGIN{test="hello,gawk";print test}'  
                                    
        printf
          格式:printf "格式",item1,item2.....
                       (1) 必須指定FORMAT
                       (2) 不會自動換行,需要顯式給出換行控制符, \n
                       (3) FORMAT中需要分別為后面每個item指定格式符                             
                          
          格式符:與item一一對應
              %c:顯示字符的ASCII碼
              %s:字符
              %d %i:數字十進制格式
              %f:浮點型
              %e %E:科學計數法表示
              %u:顯示無符號整數
              %g %G:科學計數法表示或者浮點型表示
              %%:顯示%本身
              
          修飾符:
             #[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后精度, %3.1f
             - : 左對齊(默認右對齊) %-15s
             +:顯示數值的正負符號 %+d
             
          awk實例:
              awk -F: '{printf "username:%-15s \t  UID:%+4d\n",$1,$3}' /etc/passwd   
              
        awk操作符
        
            算術操作符:
             x+y, x- y, x*y, x/y, x^y, x%y
                    - x: 轉換為負數
                    +x: 轉換為數值 
                    [root@mycentos6 ~]# awk -v a=10 -v b=10  'BEGIN{print a + b}'
                    20
                    [root@mycentos6 ~]# 
                      
                    字符串操作符:沒有符號的操作符,字符串連接  
                    [root@mycentos6 ~]# awk -v a=10 -v b=10  'BEGIN{print a  b}'
                    1010
                    [root@mycentos6 ~]#       
                  
       賦值操作符:
                    =, +=, - =, *=, /=, %=, ^=
                    ++, --  
                 比較操作符:
                    >, >=, <, <=, !=, ==
                 模式匹配符:
                    ~:左邊是否和右邊匹配包含
                    !~:是否不匹配
                 [root@mycentos6 ~]# cat /etc/passwd |awk '$0 !~ /root/' |wc -l
                    35
                [root@mycentos6 ~]# cat /etc/passwd |awk '$0 !~ /^root/' |wc -l
                    36
                [root@mycentos6 ~]#
                
                 邏輯操作符: &&, ||, !   
                     示例:注意{}位置
                    ? awk –F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd
                    ? awk - F: '$3 ==0 || $3>=1000 {print $1 }' /etc/passwd 
                    ? awk - F: ‘!($3==0) {print $1 }' /etc/passwd
                    ? awk - F: '!($3>=500) {print $3}}' /etc/passwd
                條件表達示    
                    selector?if- true- expression:if- false- expression
                    selector:為條件,如果為真執行?后面的語句,如果為假則執行:后面的語句
                    示例:
                    [root@mycentos6 ~]# awk -F: '{$3>=500?type="commonuser":type="systemuser"; \ :分行顯示,可以直接寫一行
                    > printf "%-10s \t %s\n ",$1,type}' /etc/passwd    
                              
    PATTERN
           
              作用:根據pattern條件,過濾匹配的行,再做處理    
               (1)如果未指定: 空模式,匹配每一行         
               (2) /regular expression/:僅處理能夠模式匹配到的行,需要用 / /括起來
                    awk '/^UUID/{print $1}' /etc/fstab
                    awk '!/^UUID/{print $1}' /etc/fstab    
              (3) relational expression: 關系表達式;結果有“真”有“假”;結果為“
                    真”才會被處理;
                   真:結果為非0值,非空字符串 ‘0,1’:結果為真
                   假:結果為空字符串  
              示例:
                   [root@mycentos6 ~]# awk -F: '$NF=="/bin/bash"{print $1 ,$3}' /etc/passwd
                    root 0
                    mysql 27
                    user1 500
                    user2 501
                    user3 502
                   [root@mycentos6 ~]# 
                   
                   [root@mycentos6 ~]# seq 10 |awk 'i=!i'
                    1
                    3
                    5
                    7
                    9
                    [root@mycentos6 ~]# 
             (4) line ranges: 行范圍
                startline,endline: /pat1/,/pat2/ 不支持直接給出數字格式
                awk - F: '/^root/,/^nobody/{print $1}' /etc/passwd
                awk - F: '(NR>=2&&NR<=10){print $1}' /etc/passwd      
                    
              [root@mycentos6 ~]# awk -F: '/^root/,/^user2/{print $1}' /etc/passwd       
              
              5) BEGIN/END模式
                BEGIN{}: 僅在開始處理文件中的文本之前執行一次 使用于打印標題等
                END{}:僅在文本處理完成之后執行一次

    

    示例:
        1、awk - F : 'BEGIN {print "USER USERID"} {print$1":"$3} END{print "end file"}' /etc/passwd
        2、awk - F: 'BEGIN{print " USER UID \n ---------------- "}{print $1,$3}'END{print "=============="}
            /etc/passwd
   
   
    awk  action分類
        (1) Expressions:算術,比較表達式等
        (2) Control statements: if, while等
        (3) Compound statements:組合語句
        (4) input statements
        (5) output statements: print等

    awk 控制語句:if else

   

      
     
    '{ if(condition) statement [else statement]}'
    '{if(condition1){statement1}else if(condition2){statement 2}else{statement3}}'
     
    示例:
         1、判斷磁盤使用率,如果大于70,打印磁盤名
         2、判斷成績

      1、

        9.png

      2、

        10.png

         11.png

    while 語句: 

     while循環:語法 while(condition) statement
      使用場景:對一行內的多個字段逐一類似處理時使用
           對數組中的各元素逐一處理時使用 
           
     示例:

    12.png 

  13.png

    awk中do …while語句

        語法: do statement while(condition)    
      意義:無論真假,至少執行一次循環體
         示例:
         awk 'BEGIN{ total=0;i=0;do{total+=i;i++;}while(i<=100);print total}'

    14.png   

    

    for 語句:

       
        語法: for(expr1;expr2;expr3) statement
            for(variable assignment;condition;iteration process) {forbody}
        特殊用法:能夠遍歷數組中的元素;
            語法: for(var in array) {for- body}
            
        示例: awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print$i,length($i)}}' /etc/grub2.cfg

    

    性能比較:

        

       

               #time (awk 'BEGIN{total=0;for(i=0;i<=10000;i++){total+=i;};print total;}')
        #time(total=0;for i in $(seq 10000);dototal=$(($total+i));done;echo $total)

        blob.png

       關鍵字:time

        blob.png     

    awk控制語句

        
        switch語句
        語法: switch(expression) {case VALUE1 or /REGEXP/:statement; case VALUE2 or /REGEXP2/: statement;...; default: statement}
        
        break和continue    
        next:提前結束對本行處理而直接進入下一行處理( awk自身循環)

    blob.png

    blob.png

    blob.png

    awk數組:

        關聯數組: array[index- expression]
            index- expression:
            (1) 可使用任意字符串;字符串要使用雙引號括起來
            (2)如果某數組元素事先不存在,在引用時, awk會自動創建此元素,并將其值初始化為“空串”
            (3)若要判斷數組中是否存在某元素,要使用“index in array”格式進行遍歷
            
            awk '!a[$0]++' dupfile:過濾掉重復行 ,我用以下方法寫也許更容易理解

        blob.png

       blob.png

     1、要理解:awk '!a[$0]++'先看下面程序,數組在默認不給值時,當對空值數組進行++操作,數組的值會自動+1

        blob.png 

    2、詳細說明!a[$0]++的值 當awk讀取f1時, a[111]值為空——>!a[111]值為1 ,因此打印$0;a[111]++;a[111]值為2;當再遇見a[111],也就是相同的兩行

      a[111]=2;!a[111]=0 ;一次不在打印111這一行,a[111]++ ;a[111]=3     

    

    awk數組 :

     
      若要遍歷數組中的每個元素,要使用for循環
      格式:for(var in array) {for- body}
      注意: var會遍歷array的每個索引,所以var的值也就是索引的值

      實例1、
      blob.png

     實例2、查看每個tcp狀態的連接數

       blob.png  

     實例3、查看每個ip地址訪問http鏈接數

        blob.png

        blob.png

    awk函數:        

        數值處理:
        rand():返回0和1之間一個隨機數 ,必須加srand()結合使用

        awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'

        blob.png

        

        字符串處理:

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

        blob.png

        

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

        blob.png   

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

        blob.png     

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

    blob.png

        

      自定義函數格式:

        格式:
        function name ( parameter, parameter, … ) {
        statements
        return expression

        }
     blob.png

    awk中調用shell命令      

        system命令
        空格是awk中的字符串連接符,如果system中需要使用 awk中的變量可以使用空格分隔,或者說除了 awk的變量外其他一律
        用 ""引用起來。
        awk BEGIN'{system("hostname") }'

        awk 'BEGIN{score=100; system("echo your score is " score) }'

    blob.png

    
    將awk程序寫成腳本,直接調用或執行

       

        #cat f1.awk
        if($3>=1000)print $1,$3}

        #awk – F: – f f1.awk /etc/passwd

        

        #cat f2.awk
        #!/bin/awk –f
        #this is a awk script
        {if($3>=1000)print $1,$3}
        #chmod +x f2.awk

        #f2.awk –F: /etc/passwd

    

    向awk腳本傳遞參數      

        格式:awkfile var=value var2=value2… Inputfile        

        示例:
        #cat test.awk
        #!/bin/awk –f
        {if($3 >=min && $3<=max)print $1,$3}
        #chmod +x test.awk

        #test.awk – F: min=100 max=200 /etc/passwd

        blob.png

    練習題:

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

        blob.png

        2、 統計/etc/fstab文件中每個單詞出現的次數;
        blob.png

        

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

(0)
wangnannanwangnannan
上一篇 2016-12-05
下一篇 2016-12-05

相關推薦

  • 作業–文本處理工具

    1、找出ifconfig命令結果中本機的所有IPv4地址。 [root@liang ~]# ifconfig        #centos6下 eth0      Link encap:Et…

    Linux干貨 2016-08-10
  • N25_第二周作業

    前言 我們這次使用HAProxy作為負載均衡調度器來實現后端httpd服務的負載均衡和動靜分離,實現將來自用戶的80端口的http請求轉發只后端8080端口的server服務 HAProxy介紹 HAProxy的是一個免費的,非??焖俸涂煽康慕鉀Q方案,提供高可用性,負載均衡和代理對TCP和HTTP的應用程序。它特別適用于非常高流量網站。多年來,它已成為標準的…

    Linux干貨 2016-12-12
  • 推薦-運維學習筆記-Puppet應用配置的工作原理

    背景知識 Puppet的核心功能是配置管理。一般來說,用戶在master上集中做配置,同時,被管理節點上的agent會定期從master上下載配置數據,再應用(apply)到本地,從而使管理節點的狀態(用戶,組,文件,安裝包,服務等的設置和運行狀態)與masters上定義的保持一致。 有時,出于測試的目的,并不希望真的應用配置,那么就需要執行puppet a…

    2016-06-01
  • LINUX–命令的格式、類型、別名的概述及運用

    命令格式       COMMAND [OPTIONS…] [ARGUMENTS..]      [OPTIONS..] 選項:用于啟用或關閉命令的某個或某些功能                &n…

    2017-05-21
  • MySQL Fabric 安裝部署

    MySQL Fabric  是一個用于管理 MySQL 服務器群的可擴展框架。該框架實現了兩個特性 — 高可用性 (HA) 以及使用數據分片的橫向擴展。這兩個特性既可以單獨使用,也可以結合使用。 環境: 安裝MySQL Fabric 配置MySQL Fabric MySQL Fabric 安裝管理數據庫fabric 啟動MySQL Fab…

    數據庫運維 2016-06-03
  • Linux入門命令(一)

    已經一年沒有在接觸過Linux了,經過一個星期的Linux學習之后,又重新對她產生了興趣,本周學習了一些Linux入門級的命令: (1)     (1)tty 這個命令是查看當前所處于的中終端信息的,同樣也可以使用 who am i ,who以及w來查看終端信息. 終端也還有物理終端、虛擬終端以及偽終端之分,在虛擬機下…

    2017-07-16
欧美性久久久久