1. 程式人生 > 其它 >Linux三劍客之一awk

Linux三劍客之一awk

awk

  grep、sed和awk都是讀一行處理一行,直至處理完成

定義

  格式化文字

格式

  awk [引數][分隔符] '{[處理規則]}' [操作物件]

  awk [引數][分隔符] '{BEGIN{開始初需要的處理}/定位/{迴圈}END{結束前需要的處理}}' [操作物件]

引數

  -F :指定文字中的分隔符(預設是以空格作為分隔符)

  案例:列印系統所有使用者的解析器

    awk -F: '{print $NF}' /etc/passwd

生命週期

  1.讀取一行作為待處理文字

  2.把剛剛讀取進來的文字進行分解

  3.再使用處理規則處理待處理文字

  4.處理完,賦值給$0

  5.把處理完成之後的所有的資料交給END{}來再次處理

預定義變數

  $0  :當前行所有資料

    awk -F: '{print $0, "---"}' /etc/passwd # 每行後面加上---

    是預設以空格作為分隔符拼接的意思

  $n :第n列

    awk -F: '{print $1}' /etc/passwd # 第一列

  NF :記錄當前行的欄位數(就是分隔符分了多少段數)

    awk -F: '{print NF}' /etc/passwd # 每行分了多少段

    awk -F: '{print $NF}' /etc/passwd # 只顯示最後一列

  NR

 :記錄行號

    awk -F: '{print NR}' /etc/passwd # 給每行遞增編號

  FS :指定文字中的分隔符(預設空格)(與-F的作用相似 , 但優先順序比之優先)

    定義在BEGIN{FS="指定原文字內分隔符"}中

    awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd # 以“:”讀取最後一列和第一列

  OFS :指定讀取處理出來的文字中使用的分隔符(預設空格)

    定義在BEGIN{FS="指定新文字中分隔符"}中

    awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd # 讀取最後一列和第一列中間使用>>>拼接在一起

處理規則中執行順序

  awk [引數][分隔符] '{BEGIN{開始初需要的處理}/定位/{迴圈}END{結束前需要的處理}}' [操作物件]

    BEGIN{} :開始前需要的處理

    //    :定位

    {}    :迴圈

    END{} :結束前需要的處理

中的函式 

  awk -F: 'BEGIN{OFS=" | "}{printf "|%+15s|%-15s|\n", $NF,$1}' /etc/passwd

    print :列印

    printf :格式化列印

    %s :字串

    %d :數字

    - :左對齊

    + :右對齊

    15 :至少佔用15字元

定位

  1.正則表示式

    awk -F: '/root/{print $0}' /etc/passwd # 列印含root所在行的所有內容

    awk -F: '/^root/{print $0}' /etc/passwd # 列印以root開頭所在行的所有內容

  2.比較表示式(文字內部資料比較)

    > :大於

    <  :小於

    >= :大於等於

    <= :小於等於

    ~  :表示匹配後面的正則表示式

    !~ :表示(取反)後面的正則表示式的結果

    案例:

      案例1:要求列印屬組ID大於屬主ID的行

        awk -F: '$4 > $3{print $0}' /etc/passwd # 匹配打印出第4列比第3列大的行

      案例2:結尾包含bash

        awk -F: '$NF ~ /bash/{print $0}' /etc/passwd # 讀取最後一列給到後面正則表示式篩選出bash的行

      案例3:結尾不包含bash

        awk -F: '$NF !~ /bash/{print $0}' /etc/passwd #讀取最後一列給到後面正則表示式篩選出不含bash的行

  3.邏輯表示式

    && :邏輯與

      awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd # 必須同時滿足兩個條件

    || :邏輯或

      awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd # 只要滿足一個條件

    ! :邏輯非

      awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd # 必須兩個條件同時都不滿足

  4.算術表示式

    + :加

    - :減

    * :乘

    / :除

    % :取餘

    案例:

      案例1:要求屬組 + 屬主的ID 大於 2000

        awk -F: '$3 + $4 > 2000{print $0}' /etc/passwd

      案例2:要求屬組 * 屬主的ID 大於 2000

        awk -F: '$3 * $4 > 2000{print $0}' /etc/passwd

      案例3:要求列印偶數行

        awk -F: 'NR % 2 == 0{print $0}' /etc/passwd

      案例4:要求列印奇數行

        awk -F: 'NR % 2 == 1{print $0}' /etc/passwd

  5.條件表示式(內部資料與指定資料比較)

    == :等於(相同)

    >  :大於

    <  :小於

    >= :大於等於

    <= :小於等於

    案例:要求列印第三行

      awk -F: 'NR == 3{print $0}' /etc/passwd # 指定 行編號為3的列印

  6.範圍表示式

    一個選定條件到另一個選定條件之間的資料

    eg:

      awk -F: '/^root/,/^ftp/{print $0}' /etc/passwd # 以root開頭的行到以ftp開頭的行中間的行

流程控制

  只存在迴圈中