文本處理三劍客之Gawk ?

    AWK可以說是一種語言,他有著自己的語法,可以實現函數定義,變量賦值,條件選擇(循環,判斷,選擇)…總之是值得深入研究一下的。

    AWK的起源:是個報告生成器,可以格式化文本輸出內容,它的命名是由Aho,Weinberger,Kernighan三位作者首字母組合而成的,他有多個版本:New awk(nawk),GNU awk(gawk)。

blob.png

    gawk稱為模式掃描和處理語言,它的基本用法如下:

        awk [options] 'program' var=value file…

        awk [options] -f programfile var=value file…

        awk [options] 'BEGIN{action;…}pattern{action;…}END{action;…}' file

    awk程序通常由:BEGIN語句塊,能使用模式匹配的通用語句塊,END語句塊,共三部分

    program通常是存放在單引號中

    [options]:

        -F 指明輸入使用道德字段分隔符

        -v var=value:自定義變量

    pattern和action:

        a.pattern部分決定動作語句何時觸發及觸發事件(BEGIN,END)

        b.action statements對數據進行處理,放在{}內指明(print,printf)


    分隔符,域和記錄:

        1.awk執行時,由分隔符分割的字段(域)標記$1,$2…$n稱為域標識,$0為所有域

          注意:和shell中變量$符含義不同                                        

        2.文件的每一行稱為記錄

        3.省略action,則默認執行print $0操作


    awk工作原理:

    STEP1:執行BEGIN{action;…}語句塊中的語句

    STEP2:從文件或標準輸入(stdin)讀取一行,然后執行pattern{action;…}語句塊,他逐行掃描文件,從第一行到最后一行重復這個過程,知道文件全部被讀取完畢

    STEP3:當讀至輸入流末尾時,執行END{action;…}語句塊

    BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化,打印輸出表格的表頭等語句通常卸載BEGIN語句塊中

    END語句塊在awk從輸入流中讀取玩完所有的行之后即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,他也是可選語句塊

  pattern語句塊中的通用命令是最重要的部分,也是可選的,如果沒有提供pattern語句塊,則默認執行{print},即打印每一個讀取到的行,awk讀取的每一行都會執行該語句塊。


    print格式:print item1,item2…

    要點:

    1)逗號分隔符

    2)輸出的各item可以是字符串,也可以是數值,當前記錄的字段,變量或者awk表達式

    3)省略item,相當于print $0

    blob.png


    awk變量:

    變量:內置和自定義變量

    FS:輸入字段分隔符,默認為空白字符

    blob.png

    

    OFS:輸出字段分隔符,默認為空白字符

    blob.png


    RS:輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效

        awk -v RS=' ' '{print }' /etc/passwd

    ORS:輸出記錄分隔符,輸出時用指定符號代替換行符

        awk -v ORS=' ' '{print }' /etc/passwd

    NF:字段數量

        awk -F: '{print NF}' /etc/fstab 

  blob.png

        awk -F: '{print $(NF-1)}' /etc/fstab

    blob.png


    NR:顯示行號

    行號是每讀一行就顯示該行號,而不是一次性顯示共有多少行

    FNR:顯示每個文件的行號,單獨計數

    blob.png

    FILENAME:當前文件名

        awk '{print FILENAME}' /etc/fstab

    ARGC:命令行參數

        awk '{print ARGC}' /etc/fstab

        結果顯示2,它有兩個參數,第一個參數是awk自身,第二個參數為/etc/fstab

    ARGV:數組,保存的是命令行搜給定的各參數

        awk 'BEGIN{print ARGV[0]}' /etc/fstab –> awk

    blob.png


    AWK變量:

    自定義變量

    1)-v var=value

        變量名區分字符大小寫

    2)在program中直接定義

        awk 'BEGIN{"name"="awk";print name}'

    blob.png


    printf命令

    格式化輸出:printf "FORMAT",item1,item2,…

        1)必須指定FORMAT

        2)不會自動換行,需要顯示給出換行控制符\n

        3)FORMAT中需要分別為后面每個item指定格式符

    格式符:與item一一對應

    blob.png

    修飾符:

        #[.#]:第一個數字控制顯示的寬度,第二個數字表示小數點后的精度,%3.1f

        -:左對齊(默認右對齊)%-10s    

        +:顯示數值的正負符號 %+d

    blob.png

   

    操作符:

    算數操作符:

        +,-,*,/,%,^

    字符串操作符:

        沒有符號的操作符,字符串連接

    賦值操作符:

        =,+=,-=,*=,/=,%=,^=,++,–

    比較操作符:

        >,>=,<,<=,!=,==

    模式匹配符:

        ~:左邊是否和右邊匹配包含

        !~:是否不匹配

    blob.png    

    

    邏輯操作符:

    awk -F: '$3>=0&&$3<=1000{print $1}' /etc/passwd 顯示所有系統用戶的用戶名

    awk -F: '$3==0||$3>1000{print $1}' /etc/passwd  顯示root或者普通用戶

    

    Pattern模式:

        根據pattern條件,過濾匹配的行,再做處理

        1)如果未指定:空模式,匹配每一行

        2)/regular expression/:僅處理能夠模式匹配到的行,需要用/ /括起來

            awk '/^root/{print }' /etc/passwd

        3) relation expression:關系表達式,結果有真有假,結果為真時才會被處理

            真:結果為非0值,非空字符串

            假:結果為空字符串

        blob.png

        blob.png

        seq 10 | awk 'i=!i'

        此執行結果為顯示奇數行,seq 10 生成1~10的序列,i的初始值為0,!i則表示為非0,即為真,這樣第一行就打印出來了,i=!i則i現在值為1,第一行結束,讀第二行,!i,即非1,為假,所以這一行就不輸出了,然后i被賦值為0,然后就這樣繼續循環下去,知道將序列中所有元素都讀完,這樣打印顯示的就是奇數行


        4)line ranges:行范圍

            startline,endline:/part1/,/part2/不支持直接給出數字格式

            awk -F: '/^root/,/^nobody/{print $1,$3}' /etc/passwd

            

        5) BEGIN/END模式

            BEGIN{}:僅在開始處理文本中的文本之前執行一次

            END{}: 僅在文本處理完成后執行一次

    blob.png


    AWK ACTION

    常用的action分類:

    1)Expression:算術,比較表達式等

    2)Control Statements:if,while等

    3)Compound Statements:組合語句

    4)Input Statements    

    5)Output Statements:print等


    控制語句之if-else

    語法:

       if(condition)statmement[else statement]

       if(condition1){statement1}else if{condition2}{statement2}else{statement3}

    使用場景:對awk取得的整行或某個字段做條件判斷

    blob.png

    

    控制語句之while循環

    語法:while(condition)statement    

    條件‘真’,進入循環;條件‘假’,退出循環

    使用場景;

        對一行內的多個字段逐一類似處理時使用

        對數組中的各元素逐一處理時使用

    blob.png


    控制語句之do-while循環

    語法:do statement while(condition)

    意義:無論真假,先執行一次循環體

    

    控制語句之for循環

    語法:for(expr1,expr2,expr3…)statement

    for(variable assignment;condition;iteration process){for-body}

    特殊用法:能夠遍歷數組中的元素

        語法:for(var in array){for-body}

    blob.png

    參考性能方面的數據,可以知道awk的語句執行效率比其他幾種循環遍歷要高

    

    控制語句之switch

    語法:switch(expression){case value1 or /regexp/:statement;case value2 or /regexp2/:statement;…default:statement}

    

    break,continue,next

    break是退出循環體:break[n]

    continue是退出本次循環,開始新的一輪循環:continue[n]

    next提前結束對本行處理而直接進入下一行處理(awk自身循環)

    awk -F: '{if($3%2!=0)next;print $1,$3}' /etc/passwd

    blob.png


    awk數組    

    若要遍歷數組中的每一個元素,要使用for循環

    for(var in arry){for-body}

        var會遍歷數組array中的每一個索引

    

    awk函數

    數值處理:

        rand():返回0和1之間一個隨機數

    awk 'BEGIN{srand();for(i=1;i<=10;i++)print int(rand()*100)}'

    blob.png

    

    字符串處理:

        length([s]):返回指定字符串的長度

        sub(s,r[,t]):對t字符串進行搜索s表示的模式匹配的內容,并將第一個匹配的內容替換為r

        gsub(s,r[,t]):對t字符串進行搜索s表示的模式匹配的內容,并將所有能匹配的內容替換為r

        split(s,array[,r]):以r分隔符切割s,并將切割后的結果保存在array所表示的數組中

    blob.png

    自定義函數:

    格式:

        function name(para1,para2…){

                    statements

                    return expression

        }


    awk中調用shell命令

    system命令:

        空格是awk中字符串連接符,如果system中需要使用awk中的變量可以使用空格分隔,或者說除了awk的變量外其他一律用""引用起來

        awk 'BEGIN{system("hostname")}'

        awk 'BEGIN{a="awk";system("echo " a)}'


    將awk程序攜程腳本,直接調用或執行

    blob.png    

    blob.png

    也可以向awk腳本傳遞參數

    格式:

        awk.awk var=value var2=value2 …inputfile

   blob.png 








        

原創文章,作者:Stupid_L,如若轉載,請注明出處:http://www.www58058.com/48048

(0)
Stupid_LStupid_L
上一篇 2016-09-21
下一篇 2016-09-21

相關推薦

  • lamp平臺 php解析器基于模塊和php-fpm

    首先,我先介紹一下實驗環境: http服務器:192.168.236.128(php解析器基于modules) mysql服務器:192.168.236.129 編譯和配置http服務器,http版本是2.4以上的。 由于http依賴于apr apr-util這兩個包,但是我們系統上的rpm包版本比較低,我們也需要下載這兩個源碼包來編譯,解決依賴關系。 還要…

    Linux干貨 2015-08-31
  • 馬哥門徒Linux運維課程筆記-第1天03講 計算機及操作系統基礎

    第1天03講 計算機及操作系統基礎   ◆  市面上主流Unix廠商簡介         由于Unix系統的流行,當時行業中的主流大廠商都根據SysV或BSD開發了自己的版本,主要分類如下:       ●  IBM公司根據自己CPU硬件架…

    Linux干貨 2015-03-23
  • 描述LVS的工作原理

    一、LVS結構   LVS由前端的負載均衡器(Load Balancer,LB)和后端的真實服務器(Real Server,RS)群組成。RS間可通過局域網或廣域網連接。LVS的這種結構對用戶是透明的,用戶只能看見一臺作為LB的虛擬服務器(Virtual Server),而看不到提供服務的RS群。當用戶的請求發往虛擬服務器,LB根據設定的包轉發策略和負載均衡…

    Linux干貨 2016-08-29
  • HTTP詳解(3)-http1.0 和http1.1 區別

    翻了下HTTP1.1的協議標準RFC2616,下面是看到的一些它跟HTTP1.0的差別。 1. Persistent Connection持久連接        在HTTP1.0中,每對Request/Response都使用一個新的連接。      …

    Linux干貨 2015-04-04
  • Linux之賬號管理

    Linux之賬號管理 一、新增與刪除用戶:useradd,相關配置文件,passwd,usermod,userdel 在Linux登錄系統時會輸入賬號和密碼,所以創建用戶也需要這兩個數據。新建用戶用useradd命令,密碼的給予則用passwd命令。 useradd 1.添加新用戶 -u: -u  uid username 創建用戶時指定uid(如…

    2017-07-23
  • Centos 7&6分布式lamp平臺

    Centos 7&6分布式lamp平臺 Centos 7&6分布式lamp平臺 一、環境介紹 lamp的實現方式 本文安裝方式 二、Centos 7 分布式lamp平臺,module方式 安裝httpd和php xcache phpMyAdmin wordpress https的phpMyAdmin 環境規劃 主機2配置mariadb 主機1…

    Linux干貨 2016-04-25
欧美性久久久久