linux awk(gawk)


awk的前世今生:

  awk名字的由來:分別取三個創始人Ah,Weiberger,Kernighan三個人的首字母。

  awk是一個報告生成器可以格式化輸出文本內容。模式掃描和處理語言(pattern scarming and processing language)

awk工作流程圖

  第一步:讀取被匹配到的行數據。

  第二步:按照輸入分隔符將整行數據分成n段。

  第三步:將每一段保存到awk的內置變量,依次為$1~$n。

  第四部:格式化輸出。全部輸出使用$0。  

    對段的操作:

      如:判斷第二個字段是否>2

      如:循環$1~$n,對其進行統一操作  

 

awk 的用法:

  • awk [POSIX or GNU style options ]  -f program-file [-] file......
  • awk [POSIX or GNU style options ]  [-] program-text file....

  上邊的兩個語法有點難看懂,我們可以這么用

  • awk [options] 'program' file 

    options:

      -F:指定輸入數據是的字段分割符。

      -v:自定義變量;格式為 variable=value。

    'program':awk的程序語句段

      標准形式:'PATTERN {'ACTION STATEMENTS'}'

      注意:program必須使用''引起來,以防止被shell解釋

         PATTERN為匹配模式。

         ACTION STATEMENTS為操作語句。

        注意:ACTION 是由系統的awk語句組成,各語句之間用;分隔。

 

    ACTION STATEMENTS:

      輸出命令:print

        print item1,item2,item3……

          要點1:各item之間用逗號分隔,若不適用逗號則awk會默認連接兩個item的內容。

              首先取出文件中的后五行,然后使用awk取出其第二和第四個段(默認空格為分隔符)

            

              $2和$4之間沒有逗號,則默認拼接$2$4

            

        要點2:print輸出的item可以是數值,$n,變量,或awk表達式。

              要想引用$n的值,不能把其放入“”內。

            

        要點3:若省略item,則默認輸出$0。

            

    變量:分為內置變量和自定義變量  

        內置變量:  

          FS:input field seperator。輸入字段分隔符

              可以使用-v來指定分隔符,也可以直接使用-F直接指名。

            

            

          OFS:outpu field seperator。輸出字段分隔符

            可以看到上圖的輸出內容,字段之間以空格分隔。使用OFS指定以:分隔。

            

          RS:input record seperator 。輸入時的換行符

          ORS:output record seperator。輸出時的換行符

          NF:number of field。每一行的字段數量。

              沒有指定輸入分隔符(FS),默認以空格來分隔。

            

              指定以:為分隔符后 ,輸出每一行字段數量。

            

              $NF代表的是$7即最后一行。所以輸出文件的每一行的最后一個字段。

            

        NR:numbe of record 。顯示文件的行數。每處理一行就會輸出一次行數

            

              合並多個文件的行數。

            

              NFR單獨計算每個文件的行數。

            

              END只輸出最后的行數

            

          FILENAME:正在被awk編輯的文件名。

              每處理一行數據都會打印一次文件名,test2文件有兩行數據,所以輸出兩行。

            

          ARGC:命令行參數個數 program不算參數。此處參數分別是 awk和兩個文件

            

           ARGV:是一個數組,保存了命令行參數。

            

          ARGV[index]:取出ARGV中的參數從0開始。

            

        自定義變量:-v variable=value或在program中直接定義。

          注意:變量名區分大小寫

            下邊是兩種變量定義方法。

          

          

 

      格式化輸出命令:printf

        語法:printf  FORMAT, item1,item2,……

          格式符:

            %s:顯示字符串

            %c:顯示字符對應的ASCII碼

            %d,%i:顯示十進制整數

            %e,%E:顯示科學計數法數值

            %f:顯示浮點數

            %g,%G:以科學計數法或者浮點形式顯示數值

            %u:顯示無符號整數

            %%:顯示%

 

          要點一:FORMAT必須給出

          要點二:printf輸出是不會自動換行,若需要換行可以使用換行控制符——\n

                可以看到輸出的是一堆連續的字符

              

                手動控制換行

              

          要點三:FORMAT中給出的格式符需要與item一一對應

          要點四:在printf中可以加入提示性字符

              

              

          修飾符:用來修飾格式符。

            #[.#]:第一個#用來控制字符寬度,第二個用來控制小數位數。

              

            -:左對齊。注意默認為右對齊。

              

            +:顯示數值的符號。

          操作符:

            算數運算:+  -  *  /  %  ^  -x  +x

            比較運算:>  >=  = <  <=  !=  ==

            賦值運算:++,--,+=,-=,*=,%=

            字符串操作:默認為字符串拼接

            模式匹配:

              ~:是否匹配:左側字符是否被右側模式匹配

                  如果$NF的內容能匹配行末是bash ,這輸出$1,$NF

                

              !~:是否不匹配,:左側字符是否不被右側模式匹配

            邏輯操作符:

              &&:與

              ||:或

              !:非

            函數調用:function_name(argu1,argu2……)

            條件表達式:selector?if_true_expression:if_false_expression

                如果用戶ID大於1000,則usertype=common user 否則等於sysadmin user .然后輸出$1和usertype

              

          PATTER:模式

            empty:空模式(默認),此模式會匹配文件的每一行

            /regular expression/:處理被pattern匹配的每一行

              

            relational expression :關系表達式,如果是一個布爾值。若為真則會被處理,為假被過濾

              真:非0只,非空字符

              假:0,空字符

                第三個字段值大於1000,輸出$1,$3

              

                如果最后一個字段為/bin/bash,則輸出$1,$NF

                

              

            line ranges:行范圍

              /pattern1/,/pattern2/:處理 pattern1 到 pattern2 之間(不包含pattern2)。從pattern1匹配的行開始,到pattern2匹配的行結束。

                匹配第一個以r開頭的行到第一個以t開頭的行。但是我們會發現並沒有輸出t開頭的行,結合第二個命令的輸出。

              我們會發現匹配的范圍為t開頭的前一行

              

            BEGIN和END模式:是給程序賦予初始狀態和在程序結束之后執行一些掃尾的工作。

              BEGIN{}:任何在BEGIN之后列出的操作(在{}內)將在awk開始掃描輸入之前執行一次。

              END{}:END之后列出的操作將在掃描完全部的輸入之后執行一次。

                第一步:利用BEGIN{}輸出一個表頭。

              

                第二步:格式化輸出內容

              

                第三步:利用END{}輸出表尾

              

 

 awk的基本應用到此結束

              

                

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM