1、名詞簡介linux
grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來,最經常使用。git
egrep (extended grep) egrep是grep的擴展,支持更多的re正則表達式元字符,等同於grep -E。正則表達式
fgrep (fixed grep) 就是fixed grep或fast grep,它們把全部的字母都看做單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,再也不特殊,等同於grep -F,相對於grep和egrep的執行速度最快。shell
正則表達式,又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫爲regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。express
所謂元字符就是指那些在正則表達式中具備特殊意義的專用字符,能夠用來規定其前導字符(即位於元字符前面的字符)在目標對象中的出現模式。bash
轉義字符是這樣一個字符,標誌着在一個字符序列中出如今它以後的後續幾個字符采起一種替代解釋。轉義字符是元字符(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 使用時不加「\」,詳見擴展元字符。
分組標記匹配字符,如'\(love\)',love被標記爲1。
錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。
\?
匹配零個或一個先前的字符。如:'gre\?p'匹配gr後跟一個或零個e字符,而後是p的行。
擴展元字符
POSIX字符類
3、語法
grep [options] "pattern" FILE
4、經常使用選項(如沒有特殊標識則grep、egrep、fgrep通用)
--color=aoto
匹配的內容高亮顯示。
-?
-A #
顯示匹配到的行時,順帶顯示其後面的#個行;
-B #
顯示匹配到的行時,順帶顯示前面的#行;
-C #
顯示匹配到的行時,順帶顯示後面的#行;
遞歸的讀取目錄下的全部文件,包括子目錄。 好比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