linux文本處理三劍客之grep

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                   # 一個數字開頭並以一個與開頭數字相同的數字結尾的行

分組引用

以使用括號\(***\)將一組字符括起來,表示這一組字符被當作一個整體,還可以使用 \1, \2… 對前面括號匹配所匹配的字符串進行引用

# 首個單詞和最後一個單詞一樣的行 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
發佈了23 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章