Linux基礎 grep egrep fgrep 區別及用法

1、名詞簡介linux

  1. grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來,最經常使用git

  2. egrep (extended grep) egrep是grep的擴展,支持更多的re正則表達式元字符,等同於grep -E正則表達式

  3. fgrep (fixed grep) 就是fixed grep或fast grep,它們把全部的字母都看做單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,再也不特殊,等同於grep -F,相對於grep和egrep的執行速度最快shell

  4. 正則表達式,又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫爲regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。express

  5. 所謂元字符就是指那些在正則表達式中具備特殊意義的專用字符,能夠用來規定其前導字符(即位於元字符前面的字符)在目標對象中的出現模式。bash

  6. 轉義字符是這樣一個字符,標誌着在一個字符序列中出如今它以後的後續幾個字符采起一種替代解釋。轉義字符是元字符(en:metacharacter)的一種特殊狀況。一般,斷定某字符是否爲轉義字符由上下文肯定。轉義字符即標誌着轉義序列開始的那個字符。編輯器

   轉義字符的英文爲Escape character。本來是指ASCII中的十進制27,十六進制1D,八進制033所定義的那個字符。對應於標準鍵盤左上角的ESC鍵。老式鍵盤若是沒有ESC鍵,替代輸入是「Ctrl+[」。在老式的計算機外設控制協議,ASCII碼的十進制27這個字符開始的一個字符序列,是外設的控制序列,不能按照這些字符的字面意義解釋。後來,就把最初的狹義的Escape character的含義引伸開來,在各類計算機語言與協議中,標誌着一個轉義序列開始的那個字符,都叫作Escape character。最多見的一個例子是C程序設計語言中,用反斜線字符「\」做爲轉義字符,來表示那些不可打印的ASCII控制符。在URI協議中,轉義字符是百分號「%」ide

2、 表達符集工具

基本元字符編碼

grep,egrep 均可用,部分基本元字符 egrep或grep -E  使用時不加「\」,詳見擴展元字符。


   ^
   錨定行的開始 如:'^grep'匹配全部以grep開頭的行。
   $
   錨定行的結束 如:'grep$'匹配全部以grep結尾的行。
   .
   匹配一個非換行符('\n')的字符如:'gr.p'匹配gr後接一個任意字符,而後是p。
   *
   匹配零個或多個先前字符 如:' *grep' (注意*前有空格)匹配全部零個或多個空格後緊跟grep的行,須要用egrep 或者grep帶上 -E 選項。 .*一塊兒用表明任意字符。
   []
   匹配一個指定範圍內的字符,如'[Gg]rep'匹配Grep和grep。
   [^]
   匹配一個不在指定範圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一個字母開頭,緊跟rep的行。
   \(..\)

分組標記匹配字符,如'\(love\)',love被標記爲1。

   \<
   錨定單詞的開始,如:'\<grep'匹配包含以grep開頭的單詞的行。
   \>

   錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。

   \?

   匹配零個或一個先前的字符。如:'gre\?p'匹配gr後跟一個或零個e字符,而後是p的行。

   x\{m\}
   重複字符x,m次,如:'o\{5\}'匹配包含5個o的行。
   x\{m,\}
   重複字符x,至少m次,如:'o\{5,\}'匹配至少有5個o的行。
   x\{m,n\}
   重複字符x,至少m次,很少於n次,如:'o\{5,10\}'匹配5--10個o的行。
   \w
   匹配文字和數字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G後跟零個或多個文字或數字字符,而後是p。
   \W
   \w的反置形式,匹配一個或多個非單詞字符,如點號句號等。
   \b
   單詞鎖定符,如: '\bgrep\b'只匹配grep。


擴展元字符


   用於egrep和 grep -E的元字符擴展集
   +
   匹配一個或多個先前的字符。如:'[a-z]+able',匹配一個或多個小寫字母后跟able的串,如loveable,enable,disable等。
   ?
   做用同\?,如:'gre?p'匹配gr後跟一個或零個e字符,而後是p的行。
   a|b|c
   匹配a或b或c。如:grep|sed匹配grep或sed
   ()
   分組符號,做用等同於\(\),如:love(able|rs)ov+匹配loveable或lovers,匹配一個或多個ov。
   x{m},x{m,},x{m,n}
   做用等同同x\{m\},x\{m,\},x\{m,n\}


POSIX字符類

   爲了在不一樣國家的字符編碼中保持一至,POSIX(The Portable Operating System Interface)增長了特殊的字符類,如[:alnum:]是A-Za-z0-9的另外一個寫法。要把它們放到[]號內才能成爲正則表達式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除 fgrep 外,都支持POSIX的字符類。
   [:alnum:]
   文字數字字符
   [:alpha:]
   文字字符
   [:digit:]
   數字字符
   [:graph:]
   非空字符(非空格、控制字符)
   [:lower:]
   小寫字符
   [:cntrl:]
   控制字符
   [:print:]
   非空字符(包括空格)
   [:punct:]
   標點符號
   [:space:]
   全部空白字符(新行,空格,製表符)
   [:upper:]
   大寫字符
   [:xdigit:]
   十六進制數字(0-9,a-f,A-F)


3、語法

grep [options] "pattern" FILE


4、經常使用選項(如沒有特殊標識則grep、egrep、fgrep通用)

   --color=aoto

   匹配的內容高亮顯示。

-?

   同時顯示匹配行上下的?行,如:grep -2 pattern filename同時顯示匹配行的上下2行。
   -c,--count
   只打印匹配的行數,不顯示匹配的內容。
   -i,--ignore-case
   忽略大小寫差異。
   -o, --only-matching
   只顯示正則表達式匹配的部分。(show only the part of a line matching PATTERN)
   -l,--files-with-matches
   打印匹配模板的文件清單。
   -L,--files-without-match
   打印不匹配模板的文件清單。

   -A #

   顯示匹配到的行時,順帶顯示其後面的#個行;

   -B #

顯示匹配到的行時,順帶顯示前面的#行;

   -C #

   顯示匹配到的行時,順帶顯示後面的#行;

   -n,--line-number
   在匹配的行前面打印行號。
   -v,--revert-match
   反檢索,只顯示不匹配的行。
   -w,--word-regexp
   若是被\<和\>引用,就把 表達式 作爲一個單詞搜索。
   -R, -r, --recursive

   遞歸的讀取目錄下的全部文件,包括子目錄。 好比grep -R 'pattern' test會在 test 及其子目錄下的全部文件中,匹配 pattern。

   -E

   使用擴展的正則表達式,只有grep有此選項,使用後同egrep。

   -F

   只有grep有此選項,使用後同fgrep。


5、示例


一、顯示/proc/meminfo文件中以不區分大小寫的s開頭的行;

# grep -i "^s" /proc/meminfo

# grep  "^[Ss]" /proc/meminfo

二、顯示/etc/passwd中以nologin結尾的行

# grep "nologin$" /etc/passwd

取出默認shell 爲/sbin/nologin的用戶列表

# grep nologin$" /etc/passwd|cut -d: f1

取出默認shell爲bash,且其用戶ID號最小 的用戶的用戶名

# grep "/bin/bash$" /etc/passwd | sort -t: -k3 -n |head -1|cut -d: -f1

三、顯示/etc/iniitab中以#開頭,且後面跟一個或多個空白字符,然後又跟了任意非空白字符的行;

# grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab

# grep "^[[:space:]]*#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab

# egrep "^[[:space:]]*#[[:space:]]{1,}[^[:space:]]" /etc/inittab

# grep -E "^[[:space:]]*#[[:space:]]+[^[:space:]]" /etc/inittab

四、顯示/etc/rc.d/rc.sysinit中符合形爲「任意單個字符n任意字符任意單個字符n」模式的行,即任意單個字符後面跟了個n,n後面有任意長度的字符,然後是任意單個字符後面跟了個n;

# grep ".n.*.n" /etc/rc.d/rc.sysinit

要求前n和後n一至:

# grep "\(.n\).*\1" /etc/rc.d/rc.sysinit

# grep -E "(.n).*\1" /etc/rc.d/rc.sysinit

若是.n被匹配到,則.n對應的內容就被存儲到內存中,並標記爲1,而後搜索任意個字符.*,這些字符後面跟着另一個.n(\1),找到就顯示該行。grep -E 或egrep 使用() 不用加 "\"轉義。

五、顯示/boot/grub/grub.conf文件中以一個或多個空白字符開頭的行

grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf

六、顯示/etc/inittab文件中以一個數字開頭並以一個與開頭數字相同的數字結尾的行;

grep "^\([0-9]\).*\1$" /etc/inittab

找出某文件中的,1位數,或2位數;

grep "\<[0-9]\{1,2\}\>"

grep -w "[0-9]\{1,2\}"

七、找出ifconfig命令結果 中的的1-255之間的整數;

/sbin/ifconfig|grep --color=auto -w  -E "[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]"

/sbin/ifconfig|grep --color=auto   -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>

八、顯示/etc/inittab中包含 halt 或 Single的行

grep -E "(halt|Single)" /etc/inittab

egrep "(halt|Single)" /etc/inittab

相關文章
相關標籤/搜索