目錄
一、grep和元字符
? ? ? ? 1.1、grep
? ? ? ? 1.2、元字符
二、正則匹配
? ? ? ? ?2.1、查找特定的字符
? ? ? ? ?2.2、使用[]來查找集合字符
? ? ? ? 要查找short和shirt時
? ? ? ? 要查找包含重復(fù)或單個字符oo時
? ? ? ? ?查找oo前面不是w的字符串
????????2.3、查找行首"^"與行尾字符"$"
? ? ? ? 查找以.結(jié)尾的行?
? ? ? ? 查詢空行
? ? ? ? ?2.4、查找任意一個字符“.”與重復(fù)字段“*”
? ? ? ? ?查詢多個o
? ? ? ? 查找w開頭d結(jié)尾至少包含一個o?
?????????查詢以 w 開頭 d 結(jié)尾,中間的字符可有可無的字符串。
? ? ? ? ?2.5、查找連續(xù)字符范圍{}
? ? ? ? 查找兩個o字符
????????查詢以 w 開頭以 d 結(jié)尾,中間包含 2~5 個 o 的字符串
????????查詢以 w 開頭以 d 結(jié)尾,中間包含 2 個或 2 個以上 o 的字符串?
三、擴展正則表達式
四、正則的一些實用寫法
? ? ? ? 正則表達式又稱為正規(guī)表達式、常規(guī)表達式、在代碼中常簡寫為regex、regex或RE。正則表達式是使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串,簡單來說,是一種匹配字符串的方法,通過一些特殊符號,實現(xiàn)快速查找、刪除、替換某個特定的字符串。
? ? ? ? 這里不得不提的是shell三劍客:grep,sed,awk。
一、grep和元字符
? ? ? ? 1.1、grep
grep [選項] [查找條件(正則)] [目標文件]
-E:開啟擴展的正則表達式
-c:計算找到'搜尋字符串'的次數(shù)
-i:忽略大小寫的不同,所以大小寫視為相同
-o:只顯示被漠視匹配到的字符串
-v:反向選擇,即輸出沒有匹配到的那些字符
--color=auto:可以將找到的關(guān)鍵詞部分加上顏色的顯示!
-n:順便輸出行號
-w:表示精確匹配一個字符
? ? ? ? 1.2、元字符
^ | 匹配輸入字符串的開始位置。除非在方括號表達式中使用,表示不包含該字符集合。要匹配"^"字符本身,需要轉(zhuǎn)移"\^" |
$ | 匹配輸入字符串的結(jié)尾位置。如果設(shè)置了RegExp對象的Multiline屬性,則"$"也匹配'\n'或'r' |
. | “.”代表除"\n\s"之外的任何單個字符 |
\ | 反斜杠,又叫轉(zhuǎn)義字符,去除其后緊跟的元字符或通配符的 特殊意義 |
* | 匹配前面的子表達式零次或多次。要匹配"*"字符,要進行\(zhòng)轉(zhuǎn)移 |
[ ] | 字符集合,匹配所包含的任意的一個字符 |
[^] | 復(fù)制字符集。匹配未包含在[ ]內(nèi)的任意一個字符 |
[n1-n2] | 字符范圍。匹配指定范圍內(nèi)的任意一個字符。例如[a-z]可以匹配到a到z范圍內(nèi)的任意一個小寫字母字符 |
{n} | n是一個非負整數(shù),匹配確定的n次,例如“o{2}”不能匹配“Bob”中的“o”,但是能匹配到“food”中的“oo” |
{n,} | n是一個非負整數(shù),至少(最少)匹配n次。例如,“o{2,}”不能匹配"Bob"中的“o”,但是能匹配“fooooood”中的所有o?!皁{1.}”等于“o+” |
{n,m} | n和m均為非負整數(shù),其中n<=m,最少匹配n次,最多匹配m次 |
二、正則匹配
? ? ? ? 準備一個文本文件用于演示?
? ? ? ? ?2.1、查找特定的字符
grep -n 'the' test.txt
?grep -vn 'the' test.txt? #匹配除了包含the的行
? ? ? ? ?2.2、使用[]來查找集合字符
? ? ? ? 要查找short和shirt時
? ? ? ? 比如我們要查找“shirt”與“short”這兩個字符串時,可以發(fā)現(xiàn)這兩個字符串均包含sh與rt。此時執(zhí)行下面命令可以提示查找到“shirt”和“short”這兩個字符串,其中“[]”無論有幾個字符,都代表一個字符,但是會按照[]內(nèi)的每個字符都去做一次匹配,比如[io]表示要匹配i或者o。
grep -n "sh[io]rt" test.txt
? ? ? ? 要查找包含重復(fù)或單個字符oo時
grep -n 'oo' test.txt
?
? ? ? ? ?查找oo前面不是w的字符串
? ? ? ? 若查找“oo”前面不是“w”的字符串,只需要通過集合字符的反向選擇“[A]”來實現(xiàn)該目的。例如執(zhí)行“grep -n‘[^w]oo’test.txt”命令表示在 test.txt 文本中查找“oo”前面不是“w”的字符串。
grep -n '[^w]oo' test.txt
?????????在上述命令的執(zhí)行結(jié)果中發(fā)現(xiàn)“woood”與“wooooood”也符合匹配規(guī)則,二者均包含“w”。
其實通過執(zhí)行結(jié)果就可以看出,符合匹配標準的字符加粗顯示,而上述結(jié)果中可以得知, “#woood #”中加粗顯示的是“ooo”,而“oo”前面的“o”是符合匹配規(guī)則的。同理“#woooooood#”
也符合匹配規(guī)則。
grep -n '[0-9]' test.txt
?
????????2.3、查找行首"^"與行尾字符"$"
grep -n '^the' test.txt
?grep -n '^[a-z]' test.txt
?grep -n '^[A-Z]' test.txt?
? ? ? ? 查找以.結(jié)尾的行?
?grep -n '\.$' test.txt
? ? ? ? 查詢空行
?grep -n '^$' test.txt? ? #查看空行
? ? ? ? ?2.4、查找任意一個字符“.”與重復(fù)字段“*”
grep -n'w..d' test.txt?
? ? ? ? ?查詢多個o
????????在上述結(jié)果中,“wood”字符串“w..d”匹配規(guī)則。若想要查詢 oo、ooo、ooooo 等資料, 則需要使用星號(*)元字符。但需要注意的是,“*”代表的是重復(fù)零個或多個前面的單字符。 “o*”表示擁有零個(即為空字符)或大于等于一個“o”的字符,因為允許空字符,所以執(zhí)行“grep -n'o*'test.txt”命令會將文本中所有的內(nèi)容都輸出打印。如果是“oo*”,則第一個 o 必須存在, 第二個 o 則是零個或多個 o,所以凡是包含 o、oo、ooo、ooo,等的資料都符合標準。同 理,若查詢包含至少兩個 o 以上的字符串,則執(zhí)行“grep -n 'ooo*' test.txt”命令即可。
grep -n'ooo*' test.txt? ? #匹配兩個以上的o
? ?
? ? ? ? 查找w開頭d結(jié)尾至少包含一個o?
?grep -n'woo*d' test.txt? ?
#查詢以 w 開頭 d 結(jié)尾,中間包含至少一個 o 的字符串,執(zhí)行以下命令即可實現(xiàn)。
?????????查詢以 w 開頭 d 結(jié)尾,中間的字符可有可無的字符串。
?grep -n 'w.*d' test.txt
?
????????????執(zhí)行以下命令即可查詢?nèi)我鈹?shù)字所在行????
grep -n '[0-9][0-9]*' test.txt?
? ? ? ? ?2.5、查找連續(xù)字符范圍{}
????????在上面的示例中,使用了“.”與“*”來設(shè)定零個到無限多個重復(fù)的字符,如果想要限制一個 范圍內(nèi)的重復(fù)的字符串該如何實現(xiàn)呢?例如,查找三到五個 o 的連續(xù)字符,這個時候就需 要使用基礎(chǔ)正則表達式中的限定范圍的字符“{}”。因為“{}”在 Shell 中具有特殊意義,所以在 使用“{}”字符時,需要利用轉(zhuǎn)義字符“\”,將“{}”字符轉(zhuǎn)換成普通字符。“{}”字符的使用方法如下所示。?
? ? ? ? 查找兩個o字符
grep -n 'o\{2\}' test.txt
?
????????查詢以 w 開頭以 d 結(jié)尾,中間包含 2~5 個 o 的字符串
grep -n 'wo\{2,5\}' test.txt
????????查詢以 w 開頭以 d 結(jié)尾,中間包含 2 個或 2 個以上 o 的字符串?
grep -n'wo\{2,\}d' test.txt
?
?三、擴展正則表達式
+
作用:重復(fù)一個或者一個以上的前一個字符
示例:執(zhí)行“egrep -n 'wo+d' test.txt”命令,即可查詢"wood" "woood" "woooooood"等字符串
?
作用:零個或者一個的前一個字符
示例:執(zhí)行“egrep -n 'bes?t' test.txt”命令,即可查詢“bet”“best”這兩個字符串
|
作用:使用或者(or)的方式找出多個字符
示例:執(zhí)行“egrep -n 'of|is|on'test.txt”命令即可查詢"of"或者"if"或者"on"字符串
()
作用:查找“組”字符串
示例:“egrep-n't(a|e)st'test.txt”。“tast”與“test”因為這兩個單詞的“t”與“st”是重復(fù)的,所以將“a”與“e” 列于“()”符號當中,并以“|”分隔,即可查詢"tast"或者"test"字符串
()+
作用:辨別多個重復(fù)的組
示例:“egrep -n 'A(xyz)+C' test.txt”。該命令是查詢開頭的"A"結(jié)尾是"C",中間有一個以上的"xyz"字符串的意
四、正則的一些實用寫法
? ? ? ? 比如我們要查看apache中有哪些IP對我們進行了訪問,并進行計數(shù)
cat access_log | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' ?| sort -n | uniq -c | sort -nr | head -10
[0-9]\{1,3\}:匹配0-9的數(shù)字三次
\.:IP的分割符“.”
這樣循環(huán)4次,就能識別網(wǎng)絡(luò)IP
sort -n :對數(shù)字開頭字符進行排序
sort -nr:對數(shù)字開頭字符逆向排序
uniq -c:對重復(fù)項進行計數(shù)
###后面文章我也會對sort和uniq詳細說明###
執(zhí)行效果:文章來源:http://www.zghlxwxcb.cn/news/detail-434237.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-434237.html
到了這里,關(guān)于Linux:正則表達式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!