awk基本使用


一、awk概述

  akw是一種編程語言,主要用於在Linux和Unix下對文本和數據進行處理,是Linux和Unix下的一個工具。數據可以來自標准輸入,一個或多個文件,或其他命令的輸出。

  awk的處理文本和數據的方式是逐行掃描文件,默認從第一行到最后一行,尋找匹配特定模式的行,並在這些行上進行你想要的操作。

二、使用方法

  1、命令行模式

  1)格式

    awk [選項] ['命令部分'] 文件名

    注:命令部分為shell變量時需要用雙引號

    選項說明:

      -F:定義字段分隔符,默認的分隔符是空格

      -v:定義變量並賦值

    '命令部分'說明:

      正則表達式來地址定位

        '/root/{awk語句}'      sed中:'/root/p'      //打印文件中包含root的行

        'NR==1,NR==5{awk語句}'    sed中:'1,5p'        //打印1-5行內容

        '/^root/,^ftp/{awk語句}'   sed中:'/^root/,/^ftp/p'  //打印root開頭和ftp開頭的行內人

      {awk語句1;awk語句2;...}

        '{print $0;print $1}'    sed中:'p'         //打印內容,awk語句之間需要用分號隔開

        'NR==5{print $0}'      sed中:'5p'         //打印第5行

      BGEIN...END...

        'BEGIN{awk語句};{處理中};END{awk語句}'

        'BEGIN{awk語句};{處理中}'

        '{處理中};END{awk語句}'

  2、腳本模式

    #!/bin/awk -f  //定義魔法字符

三、awk內部相關變量

  $0:當前處理行的所有記錄

  $n:當前記錄的第n個字段,字段間由分隔符分隔     awk -F: '{print $1,$3}' 

  NF:當前記錄的字段數(列數)            //awk -F: 'print NF'

  $NF:最后一列                   //$(NF-1)表示倒數第二列

  FNR/NR:行號

  FS:定義輸入間隔符                  //awk 'BEGIN{FS=":"};{print $1,$3}'  此時跟awk -F: '{print $1,$3}'是一樣的

  OFS:定義輸出字段分隔符,默認空格          //awk -F: 'BEGIN{OFS="==>"};{print $1,$3}',輸出的$1==>$3,也可以awk -F: '{print $1"==>"$3}這么寫

  RS:輸入記錄分隔符,默認換行            //awk -F: 'BEGIN{RS="\t"};{print $1,$3}',相當於以\t來分隔列

  

 

  ORS:輸出記錄分隔符,默認換行            //awk -F: 'BEGIN{ORS="\t"};{print $1,$3}',輸出用\t來分隔

四、格式化輸出print和printf

  1、print,類似echo

    date|awk '{print "年份:"$1,"時間:"$4"}'

    [xwxxh@xw shell]$ date|awk '{print "年份:" $1,"時間:" $4}'

    年份:2020年 時間:星期四  

  2、printf,類似echo -n  不換行

    awk -F: '{printf "%-15s %-10s %-15s" $1,$2,$3}' /etc/passwd

    

    說明:%s:字符類型為字符串,%d為數字類型

       %-15s:占用15個字節的字符串,'-'為左對齊方式,默認為右對齊

五、awk變量定義 

  #awk -v num=2 -F: '{print $num}' /etc/passwd  num前加了$符號,此時會打印以:為分隔符的第num列 

  #awk -v num=2 -F: '{print num}' /etc/passwd   num前不加$符號,此時有多少行就會打印多少個num 

  

   #awk -v num=1 'BEGIN{print num}'

  

  #awk -v num=1 'BEGIN{print $num}',打印內容為空 

  注:awk中調用定義的變量時不需要加$

六、awk中BEGIN...END...的運用 

  1、BEGIN:表示在程序開始之間執行

  2、END:表示所有文件處理完成后執行

  3、用法:'BEGIN{開始處理之前};{處理中};END{處理結束后}'

  

七、awk的if和if...else...結構

  1、if結構

    格式:awk [選項] '{if(表達式) {語句1;語句2....}}' 文件名

       

 

  2、if...else結構

    格式:awk [選項] '{if(表達式) {語句1;語句2...} else {語句3;語句4...}}' 文件名

     

 

   3、if...elif..else結構

    格式:awk [選項] '{if(表達式1) {語句1;語句2...} else if(表達式2) {語句3;語句4...} else {語句5...}}' 文件名

    

   4、for循環結構

     #打印1-5

    

    #打印1-10之間的和

     

   5、while循環結構

    #打印1-5

    

    #打印1-10之間的和

      

   6、嵌套循環

    #命令行模式打印

    

    #awk結構打印

    

  7、統計/etc/passwd中shell的數量

    

 

     shell[$NF]++:關聯數組,awk遍歷每一行,遇到相同的值就會加1 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM