正則表達式
作用:用來進行行文本匹配的工具[grep、sed、awk、vim、less、nginx、varnaish]
基本正則匹配選項必須用”“起來:
- <^> 匹配字符串的開始
- <$> 匹配字符串的結束。
- <.>匹配除了換行符任意字符
- <+> 匹配重復1次或更多次
- <?>重復0次或1次
- {n} 重復n次
- {n,} 重復n次或更多次
- {n,m} 重復n到m次
- \<或者\b 詞首錨定 >或者\b詞尾錨定
- (xxx) 分組:將一個或多個字符綁定在一起進行處理注意匹配到的(內容而非正則本身)會被正則表達式引擎記錄與內部變量中,可被后續調用\1,\2
- | 或者:a|b a或b
- [:alnum:] 字母和數字
- [:alpha:] 任何大小寫字符A-Z a-z
- [:digit:] 十進制數[:xdigit:] 十六進制
- [:lower:] 小寫字母 [:upper:] 大寫字母
- [:blank:] 空白字符(空格和制表符)
- [:space:] 水平和垂直的空白字符
- [:punct:] 標點符號
- [任意要匹配的字符] 會遞歸取出
注意:通配符不支持[:xxx:]這種格式
擴展正則:匹配選項必須用”“起來
- <\b>單詞的開頭或結尾,單詞的分界處。舉例:hi后面跟著lucy,\bhi\b.*\blucy\b \bx{n次}\b
- <*>匹配任意次0次或多次,前面的內容可以連續重復使用任意次以使整個表達式得到匹配
- <\d>匹配一位數字,為了避免重復可以使用\d{n}必須連續重復n次–只有python正則支持
- <\w> 匹配字母或數字或下劃線或漢字。
- <\s> 匹配任意的空白符-
- <^> 匹配字符串的開始
- <$> 匹配字符串的結束。
- <.>匹配除了換行符任意字符
- <+> 匹配重復1次或更多次
- <?>重復0次或1次
- {n} 重復n次
- {n,} 重復n次或更多次
- {n,m} 重復n到m次
- [任意要匹配的字符] 會遞歸取出
注意:與基本正則基本相同,只不過一些特殊符號不用再使\進行轉義,當然有些特例:單詞錨定和分組的后向引用仍需要\b \< \1.
舉例&作業:
Windows\d+匹配Windows后面跟1個或更多數字
匹配電話號碼:雖然可以匹配到,但是有一部分不是我們想要的結果所以可以用下面的分支條件來解決
[root@station88 src]# egrep ‘\(?[0-9]{3}[)-]?[0-9]{8}’ test.txt
作業:
1、顯示三個用戶root、mage、wang的UID和默認shell
[root@localhost lee]# cut -d: -f1,3,7 –output-delimiter = /etc/passwd|egrep “root|mage|wang”
2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包 括下劃線)后面跟一個小括號的行
[root@localhost lee]# egrep “^[[:alpha:]].*[[:punct:]]*\(\)” /etc/rc.d/init.d/functions
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
[root@localhost lee]# echo /etc/rc.d/init.d/functions |egrep -o “\b[[:alpha:]]*\b$”
4、使用egrep取出上面路徑的目錄名
[root@localhost lee]# echo /etc/rc.d/init.d/functions |egrep -o “([[:punct:]]).*\1”
5、統計last命令中以root登錄的每個主機IP地址登錄次數
[root@localhost lee]# last |grep “root” |tr -s ” “|cut -d\ -f1,3 |sort |uniq -c|sort -nr
6、利用擴展正則表達式分別表示0-9、10-99、100-199、 200-249、250-255
#echo {1..255} > 1.txt
#egrep -o “\b[0-9]\b” 1.txt
#egrep -o “\b[0-9]{2}\b” 1
#egrep -o “\b[0-9]{2}\b” 1 |less
#egrep -o “\b1[0-9]{2}\b” 1 |less
#egrep -o “\b2[0-4][0-9]\b” 1 |less
#egrep -o “\b25[0-5]\b” 1 |less
7、顯示ifconfig命令結果中所有IPv4地址
8、將此字符串:welcome to magedu linux 中的每個字符 去重并排序,重復次數多的排到前面
[root@localhost lee]# echo “welcome to magedu linux”|egrep -o “[[:alpha:]]”|sort|uniq -c|sort -nr
分支條件:
如果滿足其中任意一種規則都應當成功匹配,使用方法用|把不同的規則分隔開。
[root@station88 src]# egrep ‘\([0-9]{3}\)[0-9]{8}|^[0-9]{3}-[0-9]{8}’ test.txt
分組:過濾ip地址(搞定部分)
ifconfig eth0|egrep -o “([0-1][0-9][0-9]|2[0-5][0-4])\.([0-1][0-9][0-9]|2[0-5][0-4])\.([0-1][0-9][0-9]|2[0-5][0-4])\.([0-1][0-9][0-9]|2[0-5][0-4])”(分組引用為匹配結果的引用而非規則本身)
簡化:ifconfig eth0|egrep -o “([0-1][0-9][0-9].|2[0-5][0-4].){3}[0-1][0-9][0-9]|2[0-5][0-4]”
反義:
* \W匹配任意不是字母數字下劃線漢字的字符。
* [^aeiou]匹配除了aeiou這幾個字母以外的任意字符。
* [root@station88 src]# egrep ‘^[^0-9].*[^0-9]$’ test.txt
向后引用:
* 使用()指定一個分組后,默認分組會自動擁有一個組號,1….
* 向后引用用于重復搜索前面某個分組匹配的文本。\1匹配分組1
* 例如:\b(w+)\b\s+\1\b 可匹配重復的單詞go go go
* 也可以指定表達式的組名。(?<world>\w+)=(?’world’\w+),將祖名指定為world–實驗失敗
斷言:
* 概念:像\b,^,$這樣用于指定一個位置,這個位置滿足一定過的條件。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/86949
記錄內容不錯,可以對不記得的內容做一個備注,為了更好的復習。
給一個大的贊,治好了我多年的正則恐懼癥!