grep和egrep正則表達式

 Linux上文本處理三劍客nginx

  • grep :文本過濾( 模式:pattern) 工具
  • grep, egrep, fgrep (不支持正則表達式搜索,但搜索純文本的數據最快)
  • sed :stream editor ,文本編輯工具
  • awk :Linux上實際是gawk(GUN awk) ,文本報告生成器 

 

 正則表達式:git

  • 由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能
  • 支持正則表達式的程序:grep, vim, less,nginx等 

 

 正則表達式分兩類:正則表達式

  • 基本正則表達式:BRE 
grep ,egrep -G   
  • 擴展正則表達式:ERE 
grep -E, egrep  

  

 正則表達式引擎:算法

  • 採用不一樣算法,檢查處理正則表達式的軟件模塊
  • PCRE(Perl Compatible Regular Expressions)
  • 元字符分類:字符匹配、匹配次數、位置錨定、分組

 

 grepshell

grep: Global search REgular expression and Print out the line.express

做用:文本搜索工具,根據用戶指定的「模式」對目標文本逐行進行匹配檢查;打印匹配到的行;
模式:由正則表達式字符及文本字符所編寫的過濾條件 

  

grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]  

 

--color=auto: 對匹配到的文本着色顯示;
-v: 顯示不可以被pattern匹配到的行;
-i: 忽略字符大小寫
-n:顯示匹配的行號
-c: 統計匹配的行數,而不顯示匹配到的內容
-o: 僅顯示匹配到的字符串;
-q: 靜默模式,不輸出任何信息
-A #:after,顯示匹配的行及其後#行
-B #: before,顯示匹配的行及其前#行
-C #:context,顯示匹配的行及其先後各#行
-e:實現多個選項間的邏輯or關係 

  

grep –e 'cat' -e 'dog' file  

 

-E:使用ERE
   擴展的正則表達式  

 

 基本正則表達式元字符:vim

 字符匹配:bash

.: 匹配任意單個字符;
[]: 匹配指定範圍內的任意單個字符
[^]:匹配指定範圍外的任意單個字符
[:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]   

 

 匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數,默認工做在貪婪模式:儘量長的匹配less

* :匹配前面的字符任意次,包括0次
.* :任意長度的任意字符
\? :匹配其前面的字符0或1次
\+ :匹配其前面的字符至少1次,但不須要緊隨在第一次後面
\{m\} :匹配前面的字符m次
\{m,n\} :匹配前面的字符至少m次,至多n次
\{,n\} :匹配前面的字符至多n次
<=n次
\{m,\} :匹配前面的字符至少m次
>=m次  

 

 位置錨定:定位出現的位置工具

^ :行首錨定,用於模式的最左側
$ :行尾錨定,用於模式的最右側
^PATTERN$: 用於模式匹配整行
^$: 空行
^[[:space:]]*$ :空白行或包含tab字符的行
\< 或 \b :詞首錨定,用於單詞模式的左側
\> 或 \b :詞尾錨定;用於單詞模式的右側
注意:在grep中,字母和數字的組合也被視爲單詞
\<PATTERN\>:錨定以PATTERN表達式作爲單詞的行  

 

 分組及引用

\(\):將1個或多個字符捆綁在一塊兒做爲一個總體進行處理
\(xy\)*ab:xy做爲一個總體出現0此或屢次
   注意:分組括號中的模式匹配到的內容會被正則表達式引擎記錄與內部變量中,這些變量爲:
    \1:模式從左側起,第一個左括號以及與其匹配的右括號之間的內容
    \2:模式從左側起,第二個左括號以及與其匹配的右括號之間的內容
    \3:
    ……
    後向引用:引用前面的分組括號中的模式所匹配的字符,且引用中的數據和分組模式匹配到的數據是同樣  

 

 練習:

一、顯示/etc/passwd 文件中不以/bin/bash 結尾的行

# grep -v "/bin/bash$" /etc/passwd

2 、顯示用戶rpc 默認的shell 程序

# grep "^rpc\>" /etc/passwd | cut -d: -f7

3 、找出/etc/passwd 中的兩位或三位數

# grep -E "\<[0-9]{2,3}\>" /etc/passwd

4 、找出"netstat -tan" 命令的結果中以'LISTEN' 後跟0 、1或多個空白字符結尾的行

# netstat -tan | grep "\<LISTEN[[:space:]]*$"

 

 egrep及擴展的正則表達式

egrep = grep -E
egrep [OPTIONS] PATTERN [FILE...]
  選項:

    -i,-o,-v,q,-A,-B,-C
    -G:支持基本的正則表達式

 擴展正則表達式元字符:

 字符匹配:

.: 匹配任意單個字符;
[]: 匹配指定範圍內的任意單個字符
[^]:匹配指定範圍外的任意單個字符
[:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]   

 

 匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數,默認工做在貪婪模式,儘量長的匹配

* :匹配前面的字符任意次,包括0次
.* :任意長度的任意字符
? :匹配其前面的字符0或1次
+ :匹配其前面的字符至少1次
{m} :匹配前面的字符m次
{m,n} :匹配前面的字符至少m次,至多n次
{,n} :匹配前面的字符至多n次
<=n次
{m,} :匹配前面的字符至少m次
>=m次   

 

 位置錨定:定位出現的位置

^ :行首錨定
$ :行尾錨定
^PATTERN$: 用於模式匹配整行
^$: 空行
^[[:space:]]*$ :空白行或包含tab字符的行
\< 或 \b :詞首錨定
\> 或 \b :詞尾錨定
    注意:在grep中,字母和數字的組合也被視爲單詞

\<PATTERN\>:錨定以PATTERN表達式作爲單詞的行   

 

 分組及引用

():括號內模式會被記錄於正則表達式引擎中:
後向引用:\1,\2,\3...... 
或者
a|b:a或者b
  eg:C|cat :表示C或者cat
    (C|c)at :表示Cat或者cat  

 

 練習:

1 、顯示當前系統上,root,gao和user1用戶的相關信息

# grep -E "\<(root|gao|uer1)\>" /etc/passwd

2 、統計以root 身份登陸的每一個遠程主機IP

# who | grep -E "^root\>" | wc -l

3 、使用egrep 取出/etc/rc.d/init.d/functions

# echo "/etc/rc.d/init.d/functions" | grep -oE "[^/]+/?$"
相關文章
相關標籤/搜索