1. 程式人生 > >Linux日常——shell工具之grep(包含正則表示式)、sed

Linux日常——shell工具之grep(包含正則表示式)、sed

grep行過濾器

grep是⼀種查詢過濾⼯具
正則表示式在grep中⽤來查詢符合模式的字串。
egrep相當於grep -E,表⽰採⽤Extended正則表示式語法。
fgrep相當於grep - F,表⽰只搜尋固定字串⽽不搜尋正則表示式模式,不會按正則表示式的語法解釋後⾯的引數。
grep的正則表示式 有Basic和Extended兩種規範,它們之間的區別下面有解釋。

正則表示式

規定:⼀些特殊語法表⽰字元類、數量限定符和位置關係,然後⽤這些特殊語法和普通字元⼀起表⽰ ⼀個模式,這就是正則表達(RegularExpression)
字元類(Character Class):如上例的x和y,它們在模式中表⽰⼀個字元,但是取值範圍是 ⼀類字元中的任意⼀個。
這裡寫圖片描述


數量限定符(Quantifier): 郵件地址的每⼀部分可以有⼀個或多個x字元,地址的每⼀部分可以有1-3個y字元
這裡寫圖片描述
位置限定符(Anchor):描述各種字元類以及普通字元之間的位置關係,例如郵件地址分三部分,⽤普通字元@和.隔 開,IP地址分四部分,⽤.隔開,每⼀部分都可以⽤字元類和數量限定符描述。
這裡寫圖片描述
這裡寫圖片描述
正則表示式還有⼀個重要的應⽤是驗證⽤戶輸⼊是否合法,例如⽤戶通過⽹頁表單提交⾃⼰的email 地址,就需要 ⽤程式驗證⼀下是不是合法的email 地址,這個⼯作可以在⽹頁的Javascript 中做,也可以在⽹站後臺的程式中做,例如PHP、Perl、Python、Ruby、Java或C,所有這些語⾔都⽀持正則表示式,可 以說,⽬前不⽀持正則表示式的程式設計語⾔實在很少見。除了程式設計語⾔之外,很多UNIX 命令和⼯具 也都⽀持正則表示式,例如grep、vi、sed、awk、emacs等等。“正則表示式”就像“變數”⼀樣,它 是⼀個⼴泛的概念,⽽不是某⼀種⼯具或程式設計語⾔的特性。
注意
正則表示式引數⽤單引號括起來了,因為正則表示式中⽤到的很多特殊字元在Shell中也有特殊 含義(例如),只有⽤單引號括起來才能保證這些字元原封不動地傳給grep命令,⽽不會被Shell解釋掉。
規範:grep預設Basic規範

Basic與Extended的區別

Basic:? {} + | () 預設為普通字元,加 \ 轉義為特殊字元
Extended:? {} + | () . 預設為特殊字元,加 \ 轉義為普通字元、
所以:
這裡寫圖片描述
要求篩選出正確形式的QQ郵箱:
grep -E –color ‘[1-9][0-9]{5,12}@qq.com’
等價於:
grep -E –color ‘[1-9][0-9]{5,12}@qq.com’
這裡寫圖片描述


例項
匹配電話號碼

grep '^1[34578][0-9]{9}$' test.c

匹配ip

grep '^[12][0-9]{0,2}(\.[0-9]{0,3}){3}$' test.c

匹配163郵箱

grep '^[a-zA-Z0-9_]{1,}@163\.com$' test.c

sed—流式編輯器(Stream Editor)

  • 功能:sed主要用來自動編輯一個或多個檔案,簡化對檔案的反覆操作
  • 介紹:把前一個程式的輸入引入sed的輸入,經過一系列編輯命令轉換為另一種格式輸出,它處理的⽂件既可以由標準輸⼊重定向得到,也可以當命令⾏引數傳⼊,命令⾏引數可以⼀次傳⼊多個⽂件,sed會依次處理。
  • 格式: sed ‘/pattern/action’ filename
    pattern–正則表示式
    action–編輯操作
  • 處理資料:如果某一行與pattern匹配,則執行對應的action,如果一條命令沒有pattern只 有action,則這條命令的action將用於待處理檔案的每一行。
  • sed是一種線上編輯器,按行處理檔案
  • 模式空間(pattern space):處理時,把當前處理的行儲存在臨時緩衝區中,該緩衝區稱為“模式空間”。
    sed處理緩衝區的內容,最後將處理完成後的內容送往螢幕。接著處理下一行,不斷重複直到檔案末尾。
    要注意,此時檔案內容並沒用改變, 除非使用了重定向儲存輸出或者使用了 -i 選項。
  • 規範:sed預設Basic規範基本匹配
  • 模式空間和保持空間
    模式空間:可以想成⼯程⾥⾯的流⽔線,資料直接在它上⾯進⾏處理。進行正則匹配
    保持空間:可以想象成倉庫,我們在進⾏資料處理的時候,作為資料的暫存區域
    1.sed在正常模式下,將處理的行讀入模式空間(在正常模式下,只使用模式空間)
    2.模式空間,保持空間為兩段緩衝區
    3.資料處理只能在保持空間
    4.只有在sed使用某些命令時才使用保持空間,命令括在‘ ’裡
    5.正常情況下,如果不顯⽰使⽤某些⾼級命令,保持空間不會使⽤到。

文字處理處理過程
這裡寫圖片描述
sed命令:

+ g:[address[,address]]g 將hold space中的內容拷⻉到pattern space中, 原來pattern space⾥的內容清除             //get
+ G:[address[,address]]G 將hold space中的內容append到pattern space\n後
+ h:[address[,address]]h 將pattern space中的內容拷⻉到hold space中, 原來的hold space⾥的內容被清除              //hold
+ H:[address[,address]]H 將pattern space中的內容append到hold space\n後
+ d:[address[,address]]d 刪除pattern中的所有行,並讀入下一新⾏到 pattern中                                      //delete
+ D:[address[,address]]D 刪除multiline pattern中的第一行,不讀入下一行⼀⾏
+ x:交換保持空間和模式空間的內容
+ n:將下一行讀取到pattern space,覆蓋             //next
+ N:將下一行讀取到pattern space,追加 

1.註釋程式碼

sed '/printf/s/^/\/\//g' test.c 

這裡寫圖片描述
但此時檔案並沒有改變,要加上-i選項
這裡寫圖片描述

sed -i '/printf/s/^/\/\//g' test.c 

這裡寫圖片描述
2.去註釋

sed -i '/printf/s/\/\//g' test.c