歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 淺談Linux 的grep命令與正則表達式

淺談Linux 的grep命令與正則表達式

日期:2017/2/28 14:45:43   编辑:Linux教程

今日我們來簡要的分析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

Copyright © Linux教程網 All Rights Reserved