天天看點

awk指令簡介

 在shell指令或程式設計中,可以用AWK強大的的文本處理能力。如果要格式化封包或從一個大的文本檔案中抽取資料包,那麼awk可完成這些任務。awk是一種解釋的程式設計語言。awk也是shell過濾工具中最難掌握的。awk是一種自解釋的程式設計語言。結合awk和sed和grep,将會使awk程式設計更加容易。

awk語言最基本的功能是在檔案或字元串中基于指定的規則浏覽和抽取資訊。

有三種方式可調用awk.

<1>.指令行方式。

<2>.将所有的awk指令插入一個檔案,并利用chmod使awk檔案成為執行。

<3>.将所有的awk指令插入一個單獨檔案,然後調用。

以下簡單介紹awk的各種方式,詳細請檢視相關另外文檔

在awk中有四種概念。

1.抽取域

2.比對正規表達式

3.比較域

4.向awk傳遞參數

以下簡單介紹:

1).儲存awk輸出: #awk '{print $0}'  myfile>newfile

2).使用tee,在輸出到檔案的同時輸出到螢幕(利用管道'|')

     #awk '{print $0}' myfile |tee newfile

3).列印報告頭,#awk 'BEGIN {print "hello,this is Title\n---------"}{print $0}' newfile

4).列印資訊尾.#awk 'BEGIN{print $0} END {"end of file."}' myfile

5).比對,如下若在myfile第二列中帶有BROWN,則列印資訊

     #awk '{if ($2~/BROWN/) print $0}' myfile

6).精确比對,同上,隻是将~改為==

7).不比對,有時要浏覽資訊并抽取不比對操作的記錄,與~相反的符号是!,如下

#awk '$0 !~/BROWN/' myfile

8).比較

 如小于: #awk 'if ($1<$2) print $1' myfile

9).設定大小寫 #awk '[Gg]reen/' myfile

10).任意字元,表達式/^...a/意為前三個字元是任意字元

  #awk '$1~/^...a/' myfile

11).或關系比對,#awk '$0~/(YELLOW || RED)/' myfile

12).與:&& ,或:||

13).awk内置變量

 <1>.要快速檢視記錄個數,應使用NR,如:#awk 'END {print NR}' myfile <2>.以下使用NF變量顯示每一條讀記錄中有多少個域,并在END部份  列印輸入檔案名。#awk '{print NR,NF,$0} END {print FILENAME}' myfile

<3>. 判斷并輸出 . #awk '{if(NR>0 && $4~/BROWN/) print $0' myfile

14).可以設定輸入域到域變量名。

15).域值比較操作。

   @1.在BEGIN中給變量名指派。通常在BEGIN部分指派是很有益的,可以在awk表達式進行改動時減少很×××煩.

   @2.在關系操作中使用實際數值,使用關系操作時必須用括号括起來.

 #awk '{if($6<27) print $0}' myfile

 #awk 'BEGIN {BASELINE="27"}{if ($6<BASELINE) print $6}' myfile

  17).修改資料域取值

 當在awk中修改任何域時,重要的一點是實際的檔案可修改,改動的是cache中的awk複本,awk會在變量NR或NF中反映出修改的痕迹。

#awk '{if($1=="M.TANS")$6=$6-1;print $6}' myfile

18).修改文本域

 #awk '{if($1=="J.Troll")($1="J.L.Troll");print $1}' myfile

19).隻顯示修改記錄

#awk '{if($1=="J.Troll"){$1="J.L.Troll";print $1}}' myfile

20).建立新的輸出域

在awk中處理資料時,基于各域進行計算的建立新域是個好的習慣。如下示例:

 #awk 'BEGIN{print "Name    Score\t"}if($6<$7){$8=$7-$6;print $8}' myfile

21).增加列值

 #awk 'tot+=$6;END{print "Club Total point." tot}' myfile

22).使用模式列印檔案名及其長度,放入變量tot中

#ls -l | awk'/^[^d]{print $9 "\t" $5}{tot+=$5} END {print "Total KB:tot"}'

23).awk内置的字元串函數

24).awk腳本檔案

如以上的所述的諸多情況,這裡隻不過指令放在一個檔案中,且該檔案必須是!/bin/awk -f ,因為這樣才會使這個檔案可以自解釋。否則将不能作用。為了容易分别,最好将檔案帶一個擴充名.awk,完成對檔案的編寫後,再利用chmod  u+x使檔案可以執行。

在awk中,可以用!a[$0]++做為條件,對重複出現的行進行處理。

bash-3.2$ cat 2

abc

ef

123

dgag

xxx

bash-3.2$ awk '!a[$0]++' 2

對于awk '!a[$3]++',需要了解3個知識點

1、awk數組知識,不說了

2、awk的基本指令格式 awk 'pattern{action}'

    省略action時,預設action是{print},如awk '1'就是awk '1{print}'

3、var++的形式:先讀取var變量值,再對var值+1

以資料

1 2 3

1 2 4

1 2 5

為例,對于awk '!a[$3]++'

awk處理第一行時: 先讀取a[$3]值再自增,a[$3]即a[3]值為空(0),即為awk '!0',即為awk '1',即為awk '1{print}'

awk處理第二行時: 先讀取a[$3]值再自增,a[$3]即a[3]值為1,即為awk '!1',即為awk '0',即為awk '0{print}'

.............

最後實作的效果就是對于$3是第一次出現的行進行列印,也就是去除$3重複的行

   以上隻是我在實驗中的一些情況,awk指令功能很強大,大家可以參考其它的一些手冊去獲得更清楚的說明。

例子:

ps -ef | grep java | awk '{print $2}'| sed -n 1p 

這個跟ps -ef | grep java | awk '{print $2}'| tee | sed -n 1p 一樣

繼續閱讀