grep命令是一种强大的文本搜索工具,它按模式匹配文本,使用权限所有用户。
[options]主要参数:
-c:只输出匹配行的计数。
-R: 递归
-E: 等同于egrep
-A: 同时输出匹配行的后多少行
-B: 同时输出匹配行的前多少行
-w: 只匹配单词,而不是字符串的一部分。
-i:不区分大小写(只适用于单字符)。
-I:不区分大小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:列出匹配的文件名
-L:列出不匹配的文件名
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。

egrep和fgrep
egrep命令搜索一个或多个文件,提示符可以是延长规则表达式符合。延长规则表达式符号包括规则的表达式符号。每个模式作为一个扩展的正则表达式对待。

fgrep命令搜索一个文件为一个文字字符串或一组字符串,可以读取所有规则的字符串,但字符串没有特殊意义。
fgrep '*'  /etc/rc.d/rc.sysinit
fgrep -v '#'  /etc/squid/squid.conf
 

grep正则表达式元字符集

^:锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$:锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
.:匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
*:匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。
[]:匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^]:匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
\(..\):标记匹配字符,如'\(love\)',love被标记为1。
\<:锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行
\>:锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行
x\{m\}:重复字符x,m次,如:'0\{5\}'匹配包含5个o的行
x\{m,\}:重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行
x\{m,n\}:重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行
\w:匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W:\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b:单词锁定符,如:'\bgrep\b'只匹配grep。

用于egrep和 grep -E的元字符扩展集

+:匹配一个或多个先前的字符。如:'[a-z]+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。

?:匹配零个或多个先前的字符。如:'gr?p'匹配gr后跟一个或没有字符,然后是p的行。

a|b|c:匹配a或b或c。如:grep|sed匹配grep或sed

():分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。

x{m},x{m,},x{m,n}:作用同x\{m\},x\{m,\},x\{m,n\}


grep命令实例:
grep 'root' /var/log/messages*  显示所有以messages开头的文件中包含root的行
grep '[a-z]\{5\}' /etc/passwd或者egrep '[a-z]{5}' /etc/passwd   显示文件中匹配5个连续的小写字符的行
grep -r 'r\(oo\)t.*1'  /etc/*     如果root被匹配,则oo就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个oo(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’r(oo)t.*\1′就可以了

三命令比较:grep过滤$的时候,必须使用\\让shell识别为原义符;\字符通知grep将后面字符$视为原义符而不是元字符。
grep \\$ /etc/shadow
grep '\$' /etc/shadow
fgrep '\'$ /etc/shadow

匹配abc或者xyz
egrep 'abc|xyz' file
匹配包含日期(形式:YYYY-mm-dd)格式的行:
grep '[12][0-9]\{3\}-[01][0-9]-[0-3][0-9]' file
egrep '[12][0-9]{3}-[01][0-9]-[0-3][0-9]' file

通过管道过滤ls输出的内容,只显示以可写的文件或目录的行
ls -l| grep '[-d].w..w..w.'

通过管道过滤ls输出的内容,只显示以 ~ 或 - 或 .bak 结尾的行
ls | egrep '(~|-|\.bak)$'

egrep 'N(e|o)' /etc/passwd 搜索所有的行包含字符N,后面包括e或o的字符。

egrep '(for|the) system' /etc/rc.d/rc.sysinit 搜索包含for system或者the system的行