Linux系統命令三劍客之 awk

weixin_33763244發表於2017-11-12

命令名稱:awk

作用:

     對文字和資料進行處理

詳細說明:

     awk 是一種程式語言,用於在linux/unix下對文字和資料進行處理。

 資料可以來自標準輸入(stdin)、一個或多個檔案,或其它命令的輸出。

 它在命令列中使用,但更多是作為指令碼來使用。awk有很多內建的功能,

 比如陣列、函式等,這是它和C語言的相同之處,靈活性是awk最大的優勢。

語法格式:

     awk [options] 'scripts' var=value filename

常用引數:

     -F 指定分隔符(可以是字串或正規表示式)

 -f 從指令碼檔案中讀取awk命令

 -v var=value 賦值一個使用者定義變數,將外部變數傳遞給awk

awk 指令碼基本結構:

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' filename

 一個awk 指令碼通常由BEGIN語句+模式匹配+END語句三部分組成,這三部分都是可選項

工作原理:

第一步執行BEGIN 語句

第二步從檔案或標準輸入讀取一行,然後再執行pattern語句,逐行掃描檔案到檔案全部被讀取

第三步執行END語句

         echo "hello world" | awk 'BEGIN{ print "welcome" } END{ print "2017-08-08" }'

         welcome

         2017-08-08

         echo -e  "hello world" | awk 'BEGIN{ print "welcome" } {print} END{ print "2017-08-08" }'

         welcome

         hello world

         2017-08-08

         #不加print引數時預設只列印當前的行

         [root@mingongge ~]# echo |awk '{ a="hello"; b="nihao"; c="mingongge"; print a,b,c; }'

         hello nihao mingongge

        #使用print以逗號分隔時,列印則是以空格分界

         echo |awk '{ a="mgg"; b="mingg"; c="mingongge"; print a" is "b" or "c; }'

         mgg is mingg or mingongge

        #awk的print語句中雙引號其實就是個拼接作用

awk 的變數使用:

     內建變數

 $0       #當前記錄

 $1~$n    #當前記錄的第N個欄位

 FS       #輸入欄位分隔符(-F相同作用)預設空格

 RS       #輸入記錄分割符,預設換行符

 NF       #欄位個數就是列    

 NR       #記錄數,就是行號,預設從1開始

 OFS      #輸出欄位分隔符,預設空格

 ORS      #輸出記錄分割符,預設換行符     

 外部變數傳入

 [mingongge@ ~]#a=100

         [mingongge@ ~]#b=100

         [mingongge@ ~]#echo |awk '{print v1*v2 }' v1=$a v2=$b

         10000

awk 運算與判斷:

     算術運算子

         + -  加減

 * / & 乘 除 求餘

        ^ *  求冪

++ -- 增加或減少,作為字首或字尾

[mingongge@ ~]#awk 'BEGIN{a="b";print a,a++,a--,++a;}'

         b 0 1 1

[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,a--,++a;}'

         0 0 1 1

[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,--a,++a;}'

         0 0 0 1

#和其它程式語言一樣,所有用作算術運算子進行操作,運算元自動轉為數值,所有非數值都變為0

     賦值運算子

 = += -= *= /= %= ^= **=

 正則運算子

     ~ !~  匹配正規表示式/不匹配正規表示式

     邏輯運算子  

      ||  &&  邏輯或  邏輯與

 關係運算子

  < <= > >= != = 

 其它運算子

 $      欄位引用 

 空格   字串連結符

 ?:     三目運算子

 ln     陣列中是否存在某鍵值

awk 正則:

     ^    行首定位符

 $    行尾定位符

 .    匹配任意單個字元

 *    匹配0個或多個前導字元(包括回車)

 +    匹配1個或多個前導字元

 ?    匹配0個或1個前導字元   

 []   匹配指定字元組內的任意一個字元/^[ab]

 [^]  匹配不在指定字元組內的任意一個字元

 ()   子表示式

 |    或者

 \    轉義符

 ~,!~ 匹配或不匹配的條件語句

 x{m}  x字元重複m次

 x{m,} x字元至少重複m次

 X{m,n} x字元至少重複m次但不起過n次(需指定引數-posix或--re-interval)



本文轉自 民工哥 51CTO部落格,原文連結:http://blog.51cto.com/mingongge/1981142

相關文章