正則表達式,是用來匹配文件里的文本內(nèi)容的字符串;文件通配符十偶,是用來匹配文件名稱的。
正則表達式REGEXP:由一類特殊字符及文本字符所編寫的模式园细,其中有些字符(元字符)惦积,不表示字符字面意義,而表示控制或通配的功能珊肃。
程序支持:grep,sed,awk,vim, less,nginx,varnish等
正則表達式可以分兩類: 1荣刑、基本正則表達式:BRE? 2馅笙、擴展正則表達式:ERE
正則表達式引擎:
????????????采用不同算法伦乔,檢查處理正則表達式的軟件模塊【PCRE模塊】
????????????PCRE(Perl Compatible Regular Expressions)
元字符分類:字符匹配、匹配次數(shù)董习、位置錨定烈和、分組【見圖】
幫助:man 7 regex
---------------------------------------------------------------------------------------
字符匹配實例:
????????echo abbc | grep a..c? ? ? ? ? ?#匹配a..c
????????ls |grep -w "..."? ? ? ? ? ? ? ? ? ? ? ? #匹配
????????ls |grep -w ".\.."? ???????????????????? # \.轉(zhuǎn)義,轉(zhuǎn)換為字符的本身的含義皿淋。
????????grep "r..t" /etc/passwd ???????? #
????????[root@centos7 app]# echo axcdef |grep "a[xyz]c" #取括號內(nèi)任意一個字符匹配
????????[root@centos7 app]# echo abcdef |grep "a[^xyz]c" #排除括號內(nèi)的字符
次數(shù)匹配實例:
????????echo axxxb |grep "ax*b"
????????ls | grep ".*\.txt"
????????echo abccdd | grep "a[a-z]*c" #
????????echo abccdd | grep "a[a-z]\?c" #
實驗:#文件內(nèi)容#?cat google.txt
--------------------------------------
goooooooooooooogle
gogle
goooooooooooooooooooooooogle
ggle
goooooooOOOOOOoooole
----------------------------------------以下是匹配以上內(nèi)容--------------------
????????grep "go\?gle" google.txt #匹配前面的o字符0次或1次
????????grep "go\+gle" google.txt #匹配前面的o字符至少1次及1次以上
????????echo "1abx" | grep "[a-z.]\+" #在中括號內(nèi).不需要轉(zhuǎn)義
????????grep "go\{14\}gle" google.txt #精確匹配前面的o字符14次
????????grep "go\{2,\}\gle" google.txt #顯示匹配前面的o字符至少2次
????????grep "go\{10,20\}\gle" google.txt #匹配前面的o字符至少10次招刹,至多20次
????????grep "go\{,10\}\gle" google.txt #顯示匹配o字符至多10次
位置錨定實例:
????????[root@centos7 app]# grep "^root" passwd
????????[root@centos7 app]# grep "bash$" passwd
????????[root@centos7 app]# grep -v "^#" /etc/fstab | grep -v ^$
????????[root@centos7 app]# grep -v "^[[:space:]]*$" f1 #過濾空行
????????[root@centos7 app]# grep "\" passwd #匹配右側(cè)
????????[root@centos7 app]# grep "\" passwd #匹配整個單詞
????????[root@centos7 app]# grep "\<root" passwd #匹配左側(cè)
分組:\(\) 將一個或多個字符捆綁在一起,當作一個整體進行處理
后向引用:\1,\2,\3...........
或者:\|
實例:
????????[root@centos7 app]# echo wangwangwang | grep "\(wang\)\{3\}"
????????[root@centos7 app]# grep "^\(.*\):.*/\1$" passwd #開頭"^\(.*\):? 中間.*? 結(jié)尾\1$"
????????[root@centos7 app]# grep "^a\|^b.*" passwd
????????[root@centos7 app]# grep "^\(a\|b\).*" passwd #開頭^? 中間分組\(a\|b\)? 結(jié)尾 .*
????????[root@centos7 app]# echo bxy | grep "\(a\|b\)xy" #\(a\|b\)xy為分組窝趣,表示axy或bxy
綜合實例:
????????[root@centos7 app]# grep -o " [0-9]\+" /etc/redhat-release |grep -o "[0-9]\+" #獲取Linux版本號
????????[root@centos7 app]# cat passwd |grep "^\(\\).*\([0-9]\+\):\2.*\1$"