我們知道在 Linux 中,“一切皆文件”,作為系統(tǒng)管理員或者程序員我們每天都需要和大量的文本文件打交道。Linux 系統(tǒng)為我們提供了三個文本處理工具:grep, sed, 和 awk,它們也被稱為 Linux 文本處理的三劍客被大家廣泛使用。今天先和大家介紹一下 grep 的以及正則表達式的用法,因為 grep 只有和正則表達式結合在一起才會發(fā)揮出它強大的威力。
Grep 的用法
grep 是一個強大的文本搜索工具,可以用于在文本文件中搜索指定格式(正則表達式)的字符串,并將匹配的行輸出。它的用法如下: #grep [選項] 查找條件 目標文件
比如我們有一個文本文件,littlestar.txt,它的內容如下: TWINKLE, twinkle, little star, 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 發(fā)現在結果的最左側顯示行號
(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
最后
文本處理往往是需要命令行工具和正則表達式結合使用。正則表達式相對來說比較抽象,但實際上正則表達式的使用就是對元字符的組合運用,所以掌握每個元字符對學好正則表達式至關重要。
- The End -
|
|