今日我們來簡要的分析Linux 中的grep命令與正則表達,無論是剛學習Linux的新手還是有著豐厚經驗的大師,在我們學習Linux的生涯當中,grep命令和Regex這些知識是需要我們從瞭解熟悉到熟練運用的重要內容。
一、grep命令的使用
首先,我們來瞭解grep命令,grep (global search regular expression and printing),全面搜尋Regex並把行列印出來)是一種強大的文本搜尋工具,它能使用Regex搜尋文本,並把匹配的行列印出來。Linux中的grep命令包括、grep, egrep和fgrep 。egrep是grep的擴充,支援更多的re元字元,fgrep就是fast grep,搜尋字元比較快,但不支援Regex。
然後,我們再來熟悉一下grep命令,其命令格式為:grep [options] ‘pattern’ FILE 。其中grep的常見選項:
-v:反向選取,只顯示不符合模式的行;
-o:只顯示被模式比對的字串,而不是整個行;
-i:不區分字元的大小寫;
-r:遞迴搜尋;
-A #:顯示匹配到行時,順帶顯示其後面的#個行;
-B #:顯示匹配到行時,順帶顯示其前面的#個行;
-C #:顯示匹配到行時,順帶顯示其前後的#個行;
另外 ,為了使用者查看顯示匹配的結果,可以在grep命令之後輸入 “--color=auto”,使結果呈現顏色。
二、 Regex
上面我們提到使用grep命令搜尋Regex,那麼我們來學習一下什麼是Regex。
對於Regex,其起源並非在linux 中,Regex的“鼻祖”或許可一直追溯到科學家對人類神經系統工作原理的早期研究。而其含義是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯。給定一個Regex和另一個字串,我們可以達到如下的目的:
1. 給定的字串是否符合Regex的過濾邏輯(稱作“匹配”);
2. 可以通過Regex,從字串中擷取我們想要的特定部分。
Regex由一些一般字元和一些元字元(metacharacters)組成。元字元不表示字元本身的意義,而用於額外功能性的描述。Regex的類型包括基本Regex和擴充Regex。
三、基本Regex
^:錨定行首的符合條件內容,用法格式 "^pattern";
$: 錨定行尾的符合條件內容,用法格式 "pattern$";
*:匹配緊挨著其前面的字元任意次 ;
.:匹配任意單個字元;
.*:匹配任意長度的任一字元(貪婪模式,儘可能的匹配);
r.*h (非錨定), ^r.*h$(錨定)
[] :匹配指定範圍內的任意單個字元;
[^]:匹配指定範圍外的任意單個字元 ;
[[:space:]]:空白字元;
\?:匹配緊挨著在其前面的字元0次或1次;
\{m,n\}:匹配其前面的字元至少m次, 至多n次;
\{m,\}:至少m次,\{0,n\}:至多n次,0-n次;
\{m\}:精確匹配到m次;
\<:錨定詞首,用法格式:\<pattern;
\>: 錨定詞尾,用法格式:\>pattern;
\<pattern>:錨定單詞;
\(\):分組,用法格式:\(pattern\);
ab任一字元ab:ab.*ab;
a.b任一字元a.b;\(a.b\).*\1 (1的含義是以相同的內容出現)。
四、擴充Regex
.: 任意單個字元
[ ] : 匹配指定範圍內的任意單個字元;
[^]:匹配指定範圍外的任意單個字元 ;
*:匹配緊挨著其前面的字元任意次
+:匹配其前面的字元至少1次
{m,n}:至少m次,至多n次
():分組,支援引用\1,\2
a|b:二選一
\<: 錨定詞首,用法格式:\<pattern;
\>: 錨定詞尾,用法格式:\>pattern;
^ : 錨定行首的符合條件內容
$ : 錨定行尾的符合條件內容
Regex是如何運用在linux的命令中的呢下面我們一起來看看幾簡單的執行個體分析Regex。
五、 Regex與grep命令的實戰演 練
1,顯示/etc/rc.d/rc.sysinit檔案中以不區分大小的h開頭的行;
# grep “^[hH]” /etc/rc.d/rc.sysinit
2, 顯示/etc/passwd中以sh結尾的行;
# grep “sh$” /etc/passwd
3, 顯示/etc/fstab中以#開頭,且後面跟兩個或多個空白字元,而後又跟了任意非空白字元的行;
#grep “^#[[:space:]]\{1,\}[^[:space:]] /etc/fstab
4, 顯示/etc/rc.d/rc.local中符合形為“任意單個字元n任一字元任意單個字元n”模式的行;
# grep “\(.i\).*\1” /etc/rc.d/rc.local
5, 尋找/etc/inittab中含有“以s開頭,並以d結尾的單詞”模式的行;
# grep “\<s[a-zA-Z]*d\>” /etc/inittab
或#grep “\<s[^[:space:]]*d\>” /etc/inittab
6, 尋找ifconfig命令結果中的1-255之間的整數;
# grep | -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
7,顯示/var/log/secure檔案中包含“Failed”或“FAILED”的行;而後統計相關的行數
# egrep “(Failed | FAILED )” /var/log/secure | wc -l
8,在/etc/passwd中取出預設shell為bash,且其使用者ID號最小的使用者的使用者名稱
# grep "bash$" /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1
Linux下Shell編程——awk編程
Linux下Shell編程——sed命令基本用法
Linux下Shell編程——grep命令的基本運用
Linux下Shell編程——Regex基礎與擴充