grep命令及正則表達式,你需要知道這些

一、grep命令

  • 命令解釋
      grep, egrep, fgrep - print lines matching a pattern(打印和模式匹配的行)

基於用戶指定的“模式”,對目標文件逐行進行匹配檢查,打印匹配到的行,默認打印到終端窗口
其中,模式指的是:由正則表達式元字符所編寫出的過濾條件

  • 命令語法
      grep [OPTIONS] PATTERN [FILE…]
      grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]
  • 命令選項
選 項 解 釋
--color=auto 高亮顯示匹配到的關鍵字
-i 或 --ignore-case 忽略字符大小寫差別
-n 或 --line-number 在顯示符合樣式的那一行之前,標示出改行的列數編號
-E 或 --extend-regexp 將樣式爲延伸的正則表達式來使用
-w 或 --word-regexp 只顯示全字符合的列
-o 或 --only-matching 只顯示匹配PATTERN部分
-v 或 --revert-match 顯示不包含匹配文本的所有行(反向匹配)
-A<顯示行數> 或 --after-context=<顯示行數> 除了顯示符合範本樣式的那一列之外,並顯示該行之的內容。
-B<顯示行數> 或 --before-context=<顯示行數> 除了顯示符合範本樣式的那一列之外,並顯示該行之的內容。
-C<顯示行數> 或 --context=<顯示行數> 除了顯示符合範本樣式的那一列之外,並顯示該行之前後的內容。

二、正則表達式

1、什麼是正則表達式?

  正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。它可以分爲兩類:基本正則表達式(Basic Regular Expression 又叫 Basic RegEx 簡稱 BREs)和 擴展正則表達式

2、正則表達式元字符

  正則表達式元字符分爲四種:字符匹配,匹配次數,位置錨定、分組及引用。可以用它們來表示一些特殊的含義或功能。

  Ⅰ、字符匹配
BRE ERE 描 述
. . 匹配任意單個字符
[] [] 匹配指定範圍內任意單個字符
[^] [^] 匹配指定範圍外任意單個字符

  在方括號( [] )中可以使用一些特殊匹配模式:

匹配模式 描 述
[:upper:] 所有大寫字母
[:lower:] 所有小寫字母
[:alpha:] 所有字母
[:digit:] 所有數字
[:alnum:] 所有字母和數字
[:space:] 空白字符
[:punct:] 所有標點符號
  Ⅱ、匹配次數

tips:用在要指定出現次數的字符後面,用來限制前面字符的出現次數。

BRE ERE 描 述
* * 匹配前面的字符任意次,包括0次(貪婪模式:儘可能長的匹配)
.* .* 匹配任意長度的任意字符
\? ? 匹配前面的字符0或1次(至多1次)
\+ + 匹配前面的字符至少一次
\{n\} {n} 匹配前面的字符n次
\{n,m\} {n,m} 匹配前面的字符至少n次,至多m次
\{,n\} {,n} 匹配前面的字符至多n次
\{n,\} {n,} 匹配前面的字符至少n次
  Ⅲ、位置錨定
BRE ERE 描 述
^ ^ 行首錨定,用於模式的最左側
$ $ 行尾錨定,用於模式的最右側
^PATTERN$ ^PATTERN$ 用於模式匹配整行
^$ ^$ 空行
^[[:space:]]*$ ^[[:space:]]*$ 空白行
\< 或 \b < 或 \b 詞首錨定,用於單詞模式的左側
\> 或 \b > 或 \b 詞尾錨定,用於單詞模式的最右側
\<PATTERN\> 或 \bPATTERN\b <PATTERN> 或 \bPATTERN\b 匹配整個單詞
  Ⅳ、分組及引用
    a、分組:
BRE ERE 描 述
\(string\) (string) 分組,將一個或多個字符捆綁在一起當作一個整體處理

聽着很抽象吧!下面給大家舉個栗子:

BRE ERE 含 意
\(root\)\+ (root)+ 匹配“root”至少一次
    b、引用:
符 號 描 述
\1 模式從左側起,第一個左括號與之匹配的右括號之間模式所匹配到的字符
\2 模式從左側起,第二個左括號與之匹配的右括號之間模式所匹配到的字符

同樣也很抽象,栗子來了:

BRE ERE
\(string1+\(string2\)*\) (string1+(string2)*)

其中, \1:string1+(string2)*
    \2:string2

小tips:講到這裏,大家也可以發現:基本正則表達式與擴展正則表達式類似,只是擴展正則表達式的表達上更簡單。正則表達式需要打"\(轉義符)"來表示某些字符的意思,而擴展正則表達式則不需要。同時大家也要知道 egrepgrep -E 執行效果相似,都是使用extended regular expression語法來解讀字符串的!

3、實例

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

[root@localhost ~]# grep -v "/bin/bash$" /etc/passwd

2、找出 /etc/passwd 文件中的兩位數或三位數;

[root@localhost ~]# grep --color=auto "[0-9]\{2,3\}" /etc/passwd

3、找出 /etc/c.d/rc.sysinit 文件中,至少一個空白字符開頭,且後面非空白字符的行;

[root@localhost ~]# grep -n "^[[:space:]]\{1,\}[^[:space:]]" /etc/rc.d/rc.sysinit

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

[root@localhost ~]# netstat -tan | grep "LISTEN[[:space:]]*$"

5、這裏給出一段浪漫的文本:


  He loves his lover.
  He likes his lover.
  She likes her liker.
  She loves her liker.


找出高亮顯示的單詞前後一致(同是love或like)的行;
在這裏插入圖片描述

150講輕鬆搞定Python網絡爬蟲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章