天天看點

文本處理三劍客與正規表達式詳解

我們知道在 Linux 中,“一切皆檔案”,作為系統管理者或者程式員我們每天都需要和大量的文本檔案打交道。Linux 系統為我們提供了三個文本處理工具:grep, sed, 和 awk,它們也被稱為 Linux 文本處理的三劍客被大家廣泛使用。今天先和大家介紹一下 grep 的以及正規表達式的用法,因為 grep 隻有和正規表達式結合在一起才會發揮出它強大的威力。

Grep 的用法

grep 是一個強大的文本搜尋工具,可以用于在文本檔案中搜尋指定格式(正規表達式)的字元串,并将比對的行輸出。它的用法如下:

#grep [選項] 查找條件 目标檔案

比如我們有一個文本檔案,littlestar.txt,它的内容如下:

TWINKLE, twinkle, little star,

How I wonder what you are!

Up above the world so high,

Like a diamond in the sky.

(1) 查找一個字元串

比如要查找“twinkle”

#grep "twinkle" littlestar.txt

文本處理三劍客與正規表達式詳解

比對上的字元串用紅色突出顯示出來了。

(2) “-i”忽略大小寫

#grep -i "twinkle" littlestar.txt

文本處理三劍客與正規表達式詳解

結果可以看到TWINKLE 和 twinkle 都比對上了

(3) “-n”顯示行号

#grep -n "twinkle" littlestar.txt

文本處理三劍客與正規表達式詳解

發現在結果的最左側顯示行号

(4) “-c”僅顯示比對到的行号

#grep -c "twinkle" littlestar.txt

文本處理三劍客與正規表達式詳解

結果僅顯示 1,表示第 1 行比對到了查找的字元串

(5) “-o” 僅顯示比對到的字元串,不顯示同行的其他内容

#grep -o "twinkle" littlestar.txt

文本處理三劍客與正規表達式詳解

結果僅顯示 twinkle

(6) “-w”精确比對單詞

#grep -w "twinkle" littlestar.txt      查找twinkle

#grep -w "twink" littlestar.txt        查找twink

文本處理三劍客與正規表達式詳解

結果顯示完整的單詞 twinkle 可以比對到,如果隻查找 twink 則沒有比對上

(7) “-v“ 反轉查找,顯示不包含關鍵字的行

#grep -v "twink" littlestar.txt

文本處理三劍客與正規表達式詳解

結果除了第一行,其他都比對成功了

正規表達式

正規表達式(Regular Expression)是一種描述字元串比對模式的方式,它的應用非常廣泛,幾乎所有的主流程式設計語音裡都有正規表達式的實作,比如 Java,C#,Python等等,當然 Linux 的 Shell 對它也有很好的支援。我們很多時候想要做的是模糊查找,比如以133開頭的手機号,這個時候 grep 就需要用到正規表達式了。

正規表達式有兩個版本,基本正規表達式(BRE)和它的更新版--擴充正規表達式(ERE)。我們主要了解一下擴充版,grep 指令需要加上 -E 選項,或者使用 egrep 指令。

正規表達式中用來比對字元串模式的字元被稱作元字元,學習正規表達式主要就是學會元字元的組合運用。元字元主要有下面幾種:

  • 用于位置錨定:"^" 和 "$"
  • 用于字元比對:".","[ ]"
  • 用于比對次數:"*","+","?","{ }"
  • 用于分組:"( )"

可能看到這裡已經有很多人一頭霧水了,正規表達式到底長什麼樣呢?下面我們就看一下具體的例子吧。

(1) 位置錨定元字元:

^ 表示以某個字元串開頭,$ 表示以某個字元串結尾

比如查找以 “TWINK” 開頭的行

#grep -E "^TWINK" littlestar.txt      

文本處理三劍客與正規表達式詳解

查找以 “star,” 結尾的行

#grep "star,$" littlestar.txt     

文本處理三劍客與正規表達式詳解

(2) 字元比對元字元:

“.”表示比對任意單個字元,“[ ]”用來比對指定範圍内的單個字元

比如 "s..r" 可以比對以s開頭,r結尾的單詞

#grep "s..r" littlestar.txt      

文本處理三劍客與正規表達式詳解

"[ ]" 當中可以放具體的字元,比如 "[Tt]"表示比對大寫或者小寫的 t

#grep "^[Tt]" littlestar.txt      

文本處理三劍客與正規表達式詳解

"[ ]" 也可以用來表示一個範圍,比如 [0-9]表示單個數字,[a-z]表示單個小寫字母,[A-Z]表示一個大寫字母。[a-zA-Z]表示一個字母,包括大小寫。比如 "[A-Z][a-z][a-z][a-z]" 表示首字母大寫,四個字母的一個單詞:

#grep -E "[A-Z][a-z][a-z][a-z]" littlestar.txt      

文本處理三劍客與正規表達式詳解

"^"用來表示不在指定範圍内的其他字元,比如[^a-zA-Z]表示所有非字母的字元

#grep -E "[^a-zA-Z]" littlestar.txt

文本處理三劍客與正規表達式詳解

(3)比對次數元字元

"?" 表示比對到 0 次或 1 次,比如 "w?in" 表示 w 被比對到 0 次或 1 次,是以 "win" 或者 "in" 都可以被比對到

#grep -E "w?in" littlestar.txt

文本處理三劍客與正規表達式詳解

"+" 表示比對到至少 1 次,比如 "w+in" 就表示至少得有一個字母 w,可以是 "win" 或者 "wwin",但是 "in" 就不能比對上了

#grep -E "w+in" littlestar.txt

文本處理三劍客與正規表達式詳解

"*" 表示比對到任意次,可以是 0 次,可以是 1 次,也可以是多次,比如 "w*in" 可以比對到 "in",也可以比對到 "win" 或者 "wwin"

#grep -E "w*in" littlestar.txt

文本處理三劍客與正規表達式詳解

"*" 經常與 "." 搭配使用,".*" 表示比對任意數量的任意字元,比如 "T.*E" 可以比對到任何以 T 開頭,以 E 結尾的單詞

#grep -E "T.*E" littlestar.txt

文本處理三劍客與正規表達式詳解

"{ }" 可以用于表示明确的比對次數,比如 "lit{2}le",就表示 "little",中間要比對 2 個字母 t

#grep -E "lit{2}le" littlestar.txt

文本處理三劍客與正規表達式詳解

"{ }" 也可以指定一個比對次數的範圍,比如 "{2,3}" 表示比對 2 次到 3 次,"{2, }" 表示比對至少 2 次,最多則不限

#grep -E "lit{2,}le" littlestar.txt 

文本處理三劍客與正規表達式詳解

(4) 分組元字元

"( )" 可以将幾個字元組合在一起作為一個整體處理,比如我們想對 "twinkle," 這個字元串做為一個整體,比對它是否出現過兩次,可以寫成 "(twinkle){2}"

#grep -E -i "(twinkle,){2}" littlestar.txt

文本處理三劍客與正規表達式詳解

最後

文本處理往往是需要指令行工具和正規表達式結合使用。正規表達式相對來說比較抽象,但實際上正規表達式的使用就是對元字元的組合運用,是以掌握每個元字元對學好正規表達式至關重要。

推薦閱讀:

《Linux的運作級别與目标》

《軟連結 vs. 硬連結》

《Linux 目錄詳解》

《虛拟機安裝 Linux 最完整攻略》

《Xshell 與 Xftp 的安裝與使用》

《Linux,Unix,GNU 到底有什麼樣的淵源?》

文本處理三劍客與正規表達式詳解

- The End -

繼續閱讀