1. 程式人生 > 實用技巧 >關於awk的用法小結

關於awk的用法小結

最近太忙了,所以關於shell指令碼中awk的部分一直沒有整理,今天碰巧在做專案的時候用到了awk,所以決定好好的整理總結一下。

  一、前言

  二、awk是什麼

  三、awk的工作原理與格式介紹

  四、awk的引數格式說明

  五、總結

  一、前言

    在shell腳本里面,大體來說我們可以把所有命令拆分成兩種命令,第一種命令是查詢命令,比如說free,top等等,還有第二種命令就是處理命令,這裡面有很多,比如我之前寫過的grep,cut,sed,awk等等(反正至少目前常用的好像就這些)。不過這些命令其實有一些是重疊的,我們可以把這些命令分成兩個部分,分別是按照行來進行處理,這個命令我一般用grep就夠了,還有一種就是處理列的部分,這個命令目前我用awk就可以解決了。因此其實我在處理字串的時候用grep和awk這兩個命令就足夠了。

  二、awk是什麼

    前面提到過了,awk其實就是一種處理文字的命令,它的主要處理是按照列來進行處理文字(有很多書上把它當成一門語言來用,不過我還沒有用到那麼深)。

  三、awk的工作原理和格式介紹

    awk的工作原理為:按照行來進行處理,也就是說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。所以一般來說awk命令不跟迴圈語句連用,因為根本不需要。

    awk的格式介紹:我們從小到大來介紹awk的格式

      1、awk + '{action}' + filename 這是awk中最小的格式了,前面awk表示我要執行awk命令,後面action表示我要執行的動作,filename表示我要找到的檔名。

      這裡有兩點要說明:1、沒有+

                2、一般來說action就是print或者printf命令,到目前為止我還沒用過其他的action命令。

                3、awk中必須有這三條引數,後續加的所有條件都可以沒有,但唯獨這三條必須有。

      2、awk + 'condition + {action}' 當我們有了action之後我們就需要執行判定條件了,這裡的判定條件指的是比如我要列印多少行等等。

      3、awk + -F + 'cutcondition' + ' {condition + action}' 之後我們需要拓展它的切割條件,我們預設的話切割的是空格,但是如果我們想要指定切割目標那麼我們就需要這個東西了。

      4、awk + -F + 'cutcondition' + 'BEGIN{condition+action} + {condition + action}+END{condition + action}' 這是awk最全的表示式,awk支援BEGIN和END命令,這兩個命令的意思是,在開始的時候先執行BEGIN中的命令,在結束的時候執行END中的命令。

    這裡要說明的是:一般來說BEGIN和END只作為一些標註或者輔助作用,不作為處理文字的主要環節,處理文字還是要按照中間的部分。

  四、awk的引數格式說明

    好了,搞清楚了awk的格式,我們就來說說awk的引數格式說明,我們通過awk的格式可以看出,awk的引數主要由三部分構成,分別是cutcondition,condition和action。下面我們從前到後逐步說明一下注意事項。

  4.1 cutcondition的說明

    cutcondition,就是設定以什麼方式進行切割,之前也說了,awk預設就是按照空格來進行切割的,但是在很多時候我們可能需要其他的條件進行切割,所以這就需要修改。這裡的修改主要指兩個方面,第一是內容的修改,第二是數量的修改

   內容的修改:例如如果我們要以:來進行分割,那麼我們可以這樣awk -F '[:]'這樣就可以了。

   數量的修改:例如如果我們要以:和+來進行分割,那麼我們可以這樣awk -F '[:+]',這樣就可以了。

   這裡要說明一點,就是如果以符號和空格來進行分割,如果我們攜程awk -F '[+ ]',這樣寫就以+和一個空格來進行分割,這個需要我們在寫之前先把文字格式排一下才可以。

  4.2 condition的說明

    condition指的是我們在使用之前需要配置的引數,比如說我們要列印多少行等等。這裡一般來說我們要寫兩點:

    第一是行數,我們知道awk主要是處理列的,對行的處理並不擅長(其實一般來說awk和grep一塊用的時候更多),但是裡面還有一些簡單的處理行數的辦法,比如我們要列印第二行,就是'NR==2'即可。

    第二是匹配字元,比如我們要匹配root字元,我們可以這麼寫'/root/'即為匹配root的字串。

  這裡有一點要注意,即為如果我們想要新增多個條件,我們可以採用if語句,不過這個if語句新增稍有不同,即:

    前者:'NR==2 {action}'

    後者:'{if(NR > 1 && NR < 3) action}'

    括號的位置不同

  4.3 action

    action的話主要是用來列印的,這裡要說的是列印有print和printf兩種列印方法,print的格式為 print 內容,相對來說比較死板,但是用起來比較容易,而printf則比較靈活,可以指定字首和格式,例如printf("filename is:%10s\n",FILENAME),這樣的形式。

   最後,awk有一個內建變量表,我直接引用了其他部落格的:

ARGC 命令列引數個數 ARGV 命令列引數排列 ENVIRON 支援佇列中系統環境變數的使用 FILENAME awk瀏覽的檔名 FNR 瀏覽檔案的記錄數 FS 設定輸入域分隔符,等價於命令列 -F選項 NF 瀏覽記錄的域的個數 NR 已讀的記錄數 OFS 輸出域分隔符 ORS 輸出記錄分隔符 RS 控制記錄分隔符 $0變數是指整條記錄。$1表示當前行的第一個域,$2表示當前行的第二個域,......以此類推。

  五、總結

    本文主要寫了awk的用途,格式,工作場景,以及它的用法宣告。當然這個東西還得多用才能理解的啦。