grep簡介
grep:英文縮寫Global search Regular Expression and Print out the line(全面搜索正則表達式並把行打印出來),是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。
正則表達式
正則表達式是對字符串操作的一種邏輯公式,用事先定義好的一組特殊字符,組成一個“規則字符集合”,根據用戶指定的文本模式對目標文件進行逐行搜索匹配,顯示能被模式匹配到的結果。
給定一個正則表達式和另一個目標字符串,我們可以從給定的字符串中通過匹配模型,過濾字符串中不想要的的字符串,得到目標字符串,減少工作量。
正則表達式分類
GUN/linux下grep包括 grep、egrep和 fgrep
- egrep是grep的擴展,等同grep -E
- fgrep就是fixed grep或fast grep,等同grep -F不使用任何正則表達式,直接進行字符串匹配
常用的正則表達式一般爲基本正則表達式grep和擴展正則表達式egrep。
擴展正則表達式與基礎正則表達式的唯一區別在於:? + () {} 這幾個字符。
基礎正則表達式中,如果你想? + () {}表示特殊含義,你需要將他們轉義,
而擴展正則表達式中,如果你想? + () {} 不表示特殊含義,你需要將他們轉義。
如下例子:
[echo@localhost]$ echo aaaa | grep 'a?'
[echo@localhost]$ echo aaaa | grep '\a?'
aaaa
[echo@localhost]$ echo aaaa | grep -E 'a?'
aaaa
[echo@localhost]$ echo aaaa | egrep ' a?'
aaaa
語法
grep [OPTION] PATTERN [FILE]…
-o
:只顯示被模式匹配到的內容
-i
:ignore case,不區分字符大小寫
-E
:使用擴展的正則表達式
-w
:匹配一個完整的單詞
-v
:沒有匹配到的行
-n
:打印出匹配字符串的在文件中的行號
--color
:對匹配的字符串着色打印
-5
:匹配字符及前後各5行
-A 5
:匹配字符及後5行,同-C 5
-B 5
:匹配字符及前5行
grep -oin 'root' /etc/passwd #顯示行號,不區分大小寫只匹配到字符本身
字符匹配
.
:匹配任意單個字符
[]
:匹配指定範圍內的任意單個字符
[^]
:匹配指定範圍外的任意單個字符
[0-9]
:匹配數組 0-9 的任意一個
[0-z]
:匹配任一數字及小寫字母
[0-Z]
:匹配任一數字及大小寫字母
[[:digit:]]
:匹配任意單個數字
[[:lower:]]
:匹配任意單個小寫字母,等同[a-z]
[[:upper:]]
:匹配任意單個大寫字母,等同[A-Z]
[[:space:]]
:匹配任意單個空白字符
[[:punct:]]
:匹配任意單個標點符號
[[:alpha:]]
:匹配任意單個英文字母
[[:alnum:]]
:匹配任意單個字母或數
grep [^0-9[:lower:]] /etc/passwd # 匹配除數字和小寫字母以外的字符
匹配次數
*
: 匹配前面的字符任意次
.*
:匹配任意次 ,即匹配任意長度的任意字符
\?
:匹配前面的字符 0 次或者 1 次
\+
: 匹配前面的字符 1 次或多次
\{m\}
:匹配前面的字符 m 次
\{m,n\}
:匹配前面的字符至少 m 次,至多 n 次
\{m,\}
:匹配前面的字符至少 m 次
\{,n\}
:匹配前面的字符至多 n 次
grep "[0-9]\+.*[[:punct:]]\{3,\}" /etc/passwd # 至少一個數字及3個以上標點符號
位置錨定
^
:錨定行首
$
:錨定行尾
\<
或\b
:錨定詞首
\>
或\b
:錨定詞尾
grep -n "^[[:space:]]\+$" mydata.txt # 找出空白行的行號 grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab # 以#開頭,且後面跟一個或多個空白字符,而後又跟了任意非空白字符的行 grep '^\([0-9]\).*\1$' /etc/inittab # 一個數字開頭並以一個與開頭數字相同的數字結尾的行
分組引用
# 首個單詞和最後一個單詞一樣的行 grep "^\(\ # 匹配包含mysql或apache或redis的行,`|`表示或 egrep "mysql|apache|redis" mydata.txt # 匹配ipv4的地址 egrep "(\ # 取出默認shell爲bash,且其用戶ID號最小的用戶的用戶名 grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1以使用括號
\(***\)
將一組字符括起來,表示這一組字符被當作一個整體,還可以使用 \1, \2… 對前面括號匹配所匹配的字符串進行引用