歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> grep 命令詳解及相關事例

grep 命令詳解及相關事例

日期:2017/2/28 14:30:13   编辑:Linux教程

一.匹配字符

. 匹配任意單個字符

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

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

[: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