歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

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])\>"

grep使用簡明及正則表達式  http://www.linuxidc.com/Linux/2013-08/88534.htm

Linux下Shell編程——grep命令的基本運用 http://www.linuxidc.com/Linux/2013-06/85525.htm

Linux下Shell編程——正則表達式基礎與擴展 http://www.linuxidc.com/Linux/2013-06/85523.htm

Copyright © Linux教程網 All Rights Reserved