正則表達式學習之grep,sed和awk

  正則表達式是用於描述字符排列和匹配模式的一種語法,它主要用於字符串的模式分割、匹配、查找以及替換操做。正則表達式

  描述一個正則表達式須要字符類、數量限定符、位置限定符。規定一些特殊語法表示字符類,數量限定符和位置關係,而後用這些特殊語法和普通字符一塊兒表示一個模式,這就是正則表達式。shell

  正則表達式的語法規範以下:編輯器

    字符類:在模式中表示一個範圍,可是取值範圍是一類字符中的任意一個。工具

  

    數量限定符:限定字符類出現的次數。命令行

 

    位置限定符:描述各類字符類和普通字符之間的位置關係。blog

 

    特殊字符:圖片

 

    正則表達式有兩種規範,分別是Basic(基礎)規範和Extended(擴展)規範。grep默認按照Basic規範來寫,若是加「-E」選項的話就表示Extended規範。Basic規範中字符?+{}|()解釋爲普通字符,要表示特殊含義的話須要加\轉義。Extended擴展規範中,字符?+{}|()就表示特殊含義。字符串

  下面咱們來介紹三個工具:grep,sed和awkit

  1.grep工具io

    grep是一種強大的文本搜索工具,他能使用正則表達式搜索文本,並把匹配的行統計出來。

    命令的使用格式:grep [選項] [-color=auto] '搜索字符串' filename

    經常使用參數:

      -c:統計符合條件的正則表達式出現的次數。

      -E:支持擴展正則表達式。

      -i:忽略字符大小寫。

      -n:在顯示匹配到的字符串前面加上行號

      -v:顯示沒有「搜索字符串」內容那一行。

      -l:列出文件內容中有搜索字符串的文件名稱

      -o:只輸出文件中匹配到的部分

      -color=auto:將匹配到的字符串高亮起來

    舉幾個例子以下:

      1)統計出現出現數字的行數:

      

      選項中-c表示統計符合條件正則表達式出現的次數,{N,}表示緊跟在它前面的單元至少匹配多少次,{}是特殊字符,在非擴展(Extended)模式下須要加轉義字符將{}轉義。

      2)統計只出現字母的行

      

      -v選項是顯示沒有「搜索字符串那一行」,-E表示擴展模式,在擴展模式下特殊字符不須要轉義

     2.sed工具

      sed叫作流編輯器,在shell腳本和Makefile中做爲過濾,使用很是廣泛,即把前一個程序的輸出引入sed的輸入,通過一系列編輯命令轉換成爲另外一種格式輸出。sed是一種在線編輯器,它一次處理一行內容,處理時,把當前一個程序的行存儲在臨時緩衝區中,稱爲「模式空間」,接着sed命令處理緩衝區中的內容,處理完成以後,把緩衝區的內容送往屏幕,接着處理下一行,這樣不斷重複直到文件末尾。注意:輸出內容是模式空間處理過的內容,文件自己沒有改變。

      命令格式:sed [選項] 「[動做]" 文件名

      選項:

        -n:通常sed命令會把全部數據都輸出到屏幕,若是加入-n選項的話,則只會把通過sed命令處理的行輸出到屏幕。

        -e:容許對輸入數據應用多條sed命令編輯

        -i:用sed的修改結果直接修改讀取數據的文件,而不是由屏幕輸出

      動做:

        a:追加,在當前行後添加一行或多行

        c:行替換,在c後面的字符串替換原數據行

        i:插入,在當前行前插入一行或多行

        p:打印,輸出指定的行

        s:字符串替換,用一個字符串替換另一個字符串。格式爲「行範圍s/舊字符串/新字符串/g」(若是不加g表示只替換每行第一個匹配的字符串)

          其中行範圍可使用2,4表示第二到第4行,n表示第n行,例如sed -n '4,6p' file 打印第4到第6行,sed '2c helloworls' file 將第二行替換爲helloworld

        舉幾個例子:

        1)將以字母開頭的行中數字2替換爲two

          

        2 )刪除出現字母的行

          

          咱們能夠看到含有字母的行已經被刪除掉了,可是再cat查看的時候發現原文件沒有改變。說明輸出的只是模式空間裏面的處理結果。

      模式空間與保持空間

        保持空間:至關於一個倉庫,不能對數據進行處理

        模式空間:專門用於以行爲單位對文本進行處理

        通常狀況下,若是不顯式的使用一些選項的話,是不會到保持空間的。

        命令:

          g;將保持空間的內容拷貝到模式空間中,會將模式空間原來的值覆蓋掉。

          G:將保持空間的內容追加到模式空間中。

          h:將模式空間的值拷貝到保持空間,會將保持空間原來的值覆蓋掉

          H:將模式空間的值追加到保持空間

          d:刪除模式空間的全部行,並讀下一行到模式空間。

          D:刪除模式空間第一行,不讀下一行到模式空間。

          n:輸出模式空間的行,讀取下一行替換當前模式空間的行,接着執行下一條處理命令而不是第一條命令

          N:讀入下一行,追加到模式空間行後面,此時模式空間中有兩行。

          x:交換模式空間和保持空間的內容。

        舉幾個例子:

        1)給每行後加上空行

          

        -n選項是輸出處理過的行,G表示將保持空間中的內容追加到模式空間中,p是打印。

        2)用sed實現倒序打印

          

        解釋:若是不是第一行,就把保持空間的行所有都追加到模式空間中。而後再將模式空間中的行所有都保存到保持空間中,覆蓋掉保持空間原來的內容。若是不是最後一行的話,在刪除模式空間中的全部內容,並讀取一行到模式空間中。
這裏寫圖片描述

      3.awk工具

        awk也是文本處理工具,與sed相比,awk不只能以行爲單位,還能夠以列爲單位處理文件。awk的缺省分隔符是「\n」,缺省列分隔符是空格或tab,可是行分隔符和列分隔符均可以是自定義。awk仍是一門很複雜的腳本語言,具備像C語言同樣的分支和循環結構。

        命令格式:awk 選項 ‘編輯命令’ file1 file2...

                  awk 選項 -f 編輯腳本 file1 file2...

        awk處理文件既能夠由標準輸入重定向獲得,也能夠當命令行參數傳入。編輯命令既能夠直接當命令行參數傳入,也能夠用-f參數指定一個腳本文件。

        選項:-F:指定列分隔符,默認的列分隔符是空格或tab,能夠用-F選項自定義列分隔符。咱們將以列分隔符分開的列稱爲域。

        編輯命令:/pattern/{action}或者condition/{actions}:

          pattern:是一個正則表達式,actions是一系列的操做。awk程序以行爲單位處理文件,若是某一行匹配pattern的話,就執行actions.

          condition:知足condition條件,則執行actions。若是一條awk命令只有actions部分,則actions會處理文件中的全部行。

          action:常見的action就是print或者printf。其中printf是類C風格的。而print輸出的每一個變量之間以逗號隔開,若是是字符串的話要以雙引號括起來。

        自動變量:1表示第一列內容,2表示第二列內容,相似於shell腳本的位置參數,$0表示整行內容。

          以下:打印行的內容

          

         自定義列分隔符,輸出行信息。以下,定義":"爲分隔符

          

          除自動變量外,NF變量表示默認輸出最後一列

          

        BEGIN和END

          awk處理文件能夠分爲三個階段:處理以前、處理之中、處理以後。BEGIN是處理以前執行的動做,END是處理以後執行的動做。

          使用格式:BEGIN{action},END{action}

          

        awk也是一門弱類型語言,因此可以使用變量,可是不須要定義

        以下的例子,統計文件中的行數

          

        一樣的,統計某個目錄下文件的個數

          

        awk常見的內置變量:

          FILENAME:awk瀏覽的文件名

          FNR:瀏覽文件的記錄數,也就是行數。awk是以行爲單位處理的,因此每行內容也稱爲一個記錄。

          NF:瀏覽記錄域的個數,能夠用他來輸出最後一個域。

          FS:設置輸入域分隔符,等價於命令行-F選項。

          OFS:輸出域分隔符

        例子:

          

相關文章
相關標籤/搜索