Linux之基本正則表達式(grep)
由一類特殊字符及文本字符編寫的模式,其中有些字符不表示其字面意義,而是用於表示控制或通配的功能:
分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
元字符:\(hello[[:space:]]\+\)\+
grep: Global search REgulae expresslon and Print out the line
作用:文本搜索工具,根據用戶指定的“模式(過濾條件)”對目標文本逐行進行匹配檢查;打印匹配到的行;
模式:由正則表達式的元字符所及文本字符編寫出的過濾條件:
正則表達式引擎:
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
OPTIONS:
--color=auto:對匹配到的文本著色後高亮顯示:
-i:ignorecase,忽略字符的大小寫:
-o:僅顯示匹配到的字符串本身:
-v, --invert-match:顯示不能被模式匹配到的行:
-E, --extended-regexp:支持使用擴展的正則表達式元字符:
-q, --quiet, --silent:靜默模式,即不輸出任何信息
-A#:after,後#行
-B#: before,前#行
-C#:context,前後各#行
基本正則表達式元字符:
字符匹配:
[]: 匹配指定範圍內的任意單個字符:
[^]: 匹配制定範圍外的任意單個字符
[:digit:]、[:lower:]、[:upper:]、[:alpah:]、[:alunum:]、[:punct:]、[:space:]
匹配次數:用在要指定其出現的次數的字符的後面,用於限制器前面字符出現的次數:默認工作與貪婪模式:
*:匹配其前面的字符任意次:0,1多次:
例如:grep "x*y"
.*: 匹配任意長度任意字符
\?:匹配其前面的字符0次或1次:即其前面的字符是可有可無的:
\+:匹配其前面的字符1次或多次;及前面的字符要出現至少一次
\{m\}:匹配前面字符m次
\{m,n\}:匹配前面字符至少m次,至多n次:
\{0,n\}:至多n次:
\{m,\}:至少m次:
位置錨定:
^:行首錨定:用於要寫在模式的最左側:
$:行尾錨定:用於要寫在模式的最右側:
^PATTERN$: 用PATTERN來匹配整行“
^$:空白行:
^[[:space:]]*$:空白行或包含空白字符的行:
單詞:非特殊字符組成的連續字符串(字符串)都稱為單詞:
\<或\b:詞首錨定,用於單詞模式的左側:
\>或\b: 詞尾錨定,用於單詞模式的右側:
\<PATTERN\>:匹配完整單詞:
分組及引用:
\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理:
\(xy\)*ab
註意:分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄於內部的變量中,這些變量為:
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\3
...
He loves his lover.
He likes his lover.
She likes ker liker.
She loves her liker
~]#grep "\(l..e).*\1" lovers.txt
後向引用:引用前面的分組括號的模式所匹配到的字符:
示例:
1.顯示/etc/passwd文件中不以/bin/bash結尾的行:
~]#grep -v "bin/bash" /etc/passwd
2.找出/etc/passwd文件中兩位數或三位數;
~]#grep "\<[0-9]\{2,3\}\>" /etc/passwd
3.找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg.文件中,至少以一個空白字符開頭,且後面非空白字符的行:
~]#grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4.找出"netstat -tan"命令中以‘LISTEN’後跟0,1或多個空白字符結尾的行
netstat -tan | grep "LISTEN[[:space:]]*$"
Linux之基本正則表達式(grep)