淺談Linux 的grep命令與正則表達式
今日咱們來簡要的分析Linux 中的grep命令與正則表達,不管是剛學習Linux的新手仍是有着豐厚經驗的大師,在咱們學習Linux的生涯當中,grep命令和正則表達式這些知識是須要咱們從瞭解熟悉到熟練運用的重要內容。
一、grep命令的使用
首先,咱們來了解grep命令,grep (global search regular expression and printing),全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。Linux中的grep命令包括、grep, egrep和fgrep 。egrep是grep的擴展,支持更多的re元字符,fgrep就是fast grep,搜索字符比較快,但不支持正則表達式。
而後,咱們再來熟悉一下grep命令,其命令格式爲:grep [options] ‘pattern’ FILE 。其中grep的常見選項:
-v:反向選取,只顯示不符合模式的行;
-o:只顯示被模式匹配的字串,而不是整個行;
-i:不區分字符的大小寫;
-r:遞歸搜索;
-A #:顯示匹配到行時,順帶顯示其後面的#個行;
-B #:顯示匹配到行時,順帶顯示其前面的#個行;
-C #:顯示匹配到行時,順帶顯示其先後的#個行;
另外 ,爲了用戶查看顯示匹配的結果,能夠在grep命令以後輸入 「--color=auto」,使結果呈現顏色。
二、 正則表達式
上面咱們提到使用grep命令搜索正則表達式,那麼咱們來學習一下什麼是正則表達式。
對於正則表達式,其起源並不是在linux 中,正則表達式的「鼻祖」或許可一直追溯到科學家對人類神經系統工做原理的早期研究。而其含義是對字符串操做的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。給定一個正則表達式和另外一個字符串,咱們能夠達到以下的目的:
1. 給定的字符串是否符合正則表達式的過濾邏輯(稱做「匹配」);
2. 能夠經過正則表達式,從字符串中獲取咱們想要的特定部分。
正則表達式由一些普通字符和一些元字符(metacharacters)組成。元字符不表示字符自己的意義,而用於額外功能性的描述。正則表達式的類型包括基本正則表達式和擴展正則表達式。
三、基本正則表達式
^:錨定行首的符合條件內容,用法格式 "^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的含義是以相同的內容出現)。
四、擴展正則表達式
.: 任意單個字符
[ ] : 匹配指定範圍內的任意單個字符;
[^]:匹配指定範圍外的任意單個字符 ;
*:匹配緊挨着其前面的字符任意次
+:匹配其前面的字符至少1次
{m,n}:至少m次,至多n次
():分組,支持引用\1,\2
a|b:二選一
\<: 錨定詞首,用法格式:\<pattern;
\>: 錨定詞尾,用法格式:\>pattern;
^ : 錨定行首的符合條件內容
$ : 錨定行尾的符合條件內容
正則表達式是如何運用在linux的命令中的呢下面咱們一塊兒來看看幾簡單的實例分析正則表達式。
五、 正則表達式與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