grep 命令詳解及相關事例

grep 命令詳解及相關事例

 


一.匹配字符

.    匹配任意單個字符

[ ]  匹配指定範圍內的任意字符

[^]  匹配飛指定範圍內的任意字符

[:alpha:] 字母字符

[:lower:] 小寫字母字符

[:upper:] 大寫字母字符

[:digit:] 數字

[:alnum:] 字母數字字符

[:space:] 空白字符(禁止打印),如回車符、換行符、豎直製表符和換頁符

[:punct:] 標點字符

[:cntrl:] 控制字符(禁止打印)

[:print:] 可打印字符

使用時一般使用兩個中括號,具體會在下面的例子中使用。


二.匹配次數

*      匹配前面的字符任一次

.*     匹配任意長度的任意字符(注意貪婪模式,比如  grep  “r.*t” /etc/passwd  )

x\{m,n\}   指定前面的字符至少出現m次,至多出現N次。

x\{m,\}    指定前面的字符至少出現m次

x\{0,n\}   指定前面的字符至多出現N次

x\{m\}     精確匹配m次

?         匹配其前面的字符0或1次


三.錨定符

1.^  錨定行首     grep  "^r..t"  /etc/passwd

2.$  錨定行尾     grep  "h$"  /etc/passwd

3.^$ 錨定空白行   grep  "^$"  /etc/passwd

4.\< (\b)   錨定詞首     grep  "\<r..t"  /etc/passwd

5.\> (\b)   錨定詞首     grep  "r..t\>"  /etc/passwd

示例(容易混淆):

至少包含一個空白字符           grep  "[[:space:]]\{1,\}"   /etc/passwd 

至少包含一個非空白字符         grep  "[^[:space:]]\{1,\}"   /etc/passwd

沒有一個空白字符               grep  -v "[^[:space:]]\{1,\}"   /etc/passwd

6.\(\)對字符分組   grep  "\(l..e\).*\1r"

示例:

grep --color "l\([13]\):\1:.*:\1"   /etc/inittab


四.選項   

  -v    對結果取反

  -i    忽略字母大小寫

  -o    僅顯示匹配到的字符串(行的其他內容不顯示)

  -E    支持擴展的正則表達式

  -A n    顯示匹配到的行下面n行

  -B n    顯示匹配到的行上面n行

  -C n    顯示匹配到的行上下面各顯示n行



練習:


1.查找系統中user1用戶的相關信息。(提前建好user11,myuser1)(易錯)

grep "user1"  /etc/passwd    所有包含user1的行

grep "\<user1\>"  /etc/passwd     表面可以,但是添加以下用戶,就不可以了

useradd   -c  "user1's  uncle"  /etc/passwd   -c  是註釋

grep "^\<user1\>"  /etc/passwd    成功匹配  


2.查找系統中以user開頭後面跟了數字的用戶的相關信息。

grep "^user[0-9]\{1,\}\>"  /etc/passwd


3.分析/etc/inittab 文件如下兩行文本的特徵,編寫可以精確查到的類似兩行的模式,

  要求每行的數字必須相同。

  l1:1:wait:/etc/rc.d/rc 1

  l3:3:wait:/etc/rc.d/rc 3


 grep "l\([13]\):\1:.*:.* \1"  inittab 


擴展:匹配所有上述特徵:grep "l\([0-9]\):\1:.*:.* \1"  inittab

如果超過10,需要添加最小匹配:grep "l\([0-9]\{1,\}\):\1:.*:.* \1"  inittab


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

grep "^[sS]" /proc/meminfo 


5.顯示/etc/passwd中以nologin結尾的行

grep "nologin$" /etc/passwd


6.顯示/etc/inittab中以#開頭,且後面跟一個或者多個空白字符,而後又跟了任意非空白字符的行

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


7.顯示/etc/inittab中包含了兩個冒號中間一個數字的行

grep ":[0-9]:" /etc/inittab 


8.顯示/boot/grub/grub.conf 文件中以一個或者多個空白字符的行

 grep ":[0-9]:" /etc/inittab 


9.顯示/etc/inittab文件中以一個數字開頭並以一個開頭數字相同的數字結尾的行。

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


10.顯示/etc/inittab文件中非空白的行

grep -v  "^$"  /etc/inittab


11.取出當前網絡接口的相關IP地址(不包含127.0.0.1)

ifconfig |grep "inet addr" |grep -v "127.0.0.1"| cut -d: -f2|cut -d" " -f1

ifconfig |grep -A 1 "eth" |grep -o "addr:[0-9.]\{1,\}"|cut -d: -f2


五.擴展正則表達式

與正則表達式不同之處:

\(\)替換爲 ()

\{\}替換爲 {}

+  次數匹配,匹配其前的額字符一次或者多次

|  或者


示例:

匹配ifconfig結果中出現數字爲1-255之間的整數

ifconfig|grep --color -E "\<([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-5][0-5])\>"





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