1. 程式人生 > 實用技巧 >Linux命令awk

Linux命令awk

一. 命令awk簡介

    1. awk是一種程式語言,用於對文字和資料進行處理的

    2. 具有強大的文字格式化能力

    3. 利用命令awk,可以將一些文字整理成為我們想要的樣子

    4. 命令awk是逐行進行處理的

二. grep、sed、awk的簡單比較

    1. 命令grep,更適合單純的查詢或匹配文字

    2. 命令sed,更適合對匹配到的文字進行編輯

    3. 命令awk,更適合文字格式化,對文字進行較複雜的格式處理

三. 命令awk基本語法

    awk [options] 'pattern{action}' file

   1. 在沒有options和pattern的情況下,使用命令awk

    

    2. pattern包括兩種特殊模式,分別是BEGIN和END

    (1)BEGIN模式,是指命令在處理文字之前執行

    

    (2)END模式,是指命令在處理文字之後執行

    (3)BEGIN模式和END模式同時存在時,其中,BEGIN與END之間的{}相當於一個迴圈體,對檔案中的每一行進行處理

    

  3. 常用的引數

    (1)-F,用於指定輸入分隔符

    

    (2)-v,用於設定變數的值

    

    

      從檔案中輸入變數

    

四. 變數

  awk中的變數分為內建變數和自定義變數兩種

  1. 內建變數

FS 輸入欄位分隔符,預設為空白字元
OFS 輸出欄位分隔符,預設為空白字元
RS 輸入記錄分隔符(輸入換行符),指定輸入時的換行符
ORS 輸出記錄分隔符(輸出換行符),指定輸出時的換行符
NF 當前行的欄位數(當前行被分隔符分割成了幾段)
NR 當前行的行號
FNR 不同檔案分別計數
FILENAME 當前檔名
ARGV 陣列,儲存的是命令列所給定的各引數
ARGC ARGC陣列的個數

    

  (1)FS:以“:”為欄位輸入分隔符,輸出第1列和第2列

      1)使用-F選項指定輸入分隔符

    

      2)使用內建變數FS指定輸入分隔符,需要注意的是,使用變數時,要使用-v選項來指定對應的變數

    

    (2)OFS:以“#”為欄位輸出分隔符,輸出第1列和第2列

    

    (3)RS:以“:”為行輸入分隔符,輸出對應的行號和當前行內容。

      需要注意的是,兩個紅框中的內容,由於Jack和DEF、Alice和GHI之間沒有“:”,所以在awk中被認作為同一行

    

    (4)ORS:以“---”為行輸出分隔符

    

    (5)NF:當前行的欄位數

      其中,$NF表示的是最後一個欄位的內容,$(NF-1)表示的是倒數第二個欄位的內容

    (6)NR:當前行號

    (7)FNR:不同檔案分別計數

    

    (8)FILENAME:顯示當前行的檔名

    

    (9)ARGV:陣列,儲存的是命令列所給定的各引數

    

    (10)ARGC:儲存的是ARGV陣列的個數

    

  2. 自定義變數

    (1)使用-v來自定義變數(在上第三節已介紹)

    (2)在awk中直接定義

    

   

五. 格式化中,awk使用printf時需要注意的問題

  1. 使用printf輸出的文字不會換行,如果需要換行,可以在對應的“格式替換符”後加入“\n”進行轉義

  2. 使用printf輸出時,“指定的格式”與“被格式化的文字”之間,要用“,”隔開

  3. 使用printf輸出時,“格式”中的“格式替換符”必須與“被格式化的文字”一一對應(個數要相同)

六. awk中的pattern模式

  當awk進行逐行處理時,會把pattern作為條件,判斷當前行是否滿足條件,若跟pattern匹配,則進行後面的處理,否則,跳過當前行。

  

  1. 正則表示式

    awk下的正則表示式與grep下的區別:

    1)awk下: awk '/正則表示式/{print}' /etc/passwd

    2)grep下: grep "正則表示式" /etc/passwd

    

    需要注意的是 

      1)在awk的正則表示式中,若出現"/",則需要進行轉義,在其前面加"\"

      2)當使用{x,y}型別次數匹配的正則表示式時,需要使用--posix選項或--re-interval選項

  2. 行範圍匹配

    awk '/正則表示式1/,/正則表示式2/{action}' file

    表示的是,從被正則表示式1匹配到的行開始,到被正則表示式2匹配到的行結束,之間所有的行都會執行對應的動作。

七. 關係運算符

關係運算符 含義 用法例項
< 小於 x<y
<= 小於等於 x<=y
> 大於 x>y
>= 大於等於 x>=y
== 等於 x==y
!= 不等於 x!=y
~ 匹配 x~/正則表示式/
!~ 不匹配 x!~/正則表示式/

八. 條件判斷

1 2 3 4 5 6 if(表示式) {語句1} elseif(表示式) {語句2} else {語句3}

  例項

1 2 3 4 5 6 7 8 9 10 11 12 awk'BEGIN{ test=100; if(test>90){ print"very good"; } elseif(test>60){ print"good"; } else{ print"no pass"; } }'

  

九. 迴圈語句

  1. while迴圈語句

1 2 while(表示式) {語句}

  例項

1 2 3 4 5 6 7 8 9 awk'BEGIN{ test=100; total=0; while(i<=test){ total+=i; i++; } print total; }'

  2. for迴圈語句

    1)第一種

1 2 for(變數in陣列) {語句}

    2)第二種

1 2 for(變數;條件;表示式) {語句}

  3. do迴圈語句

1 2 3 do {語句} while(條件)