grep家族简介
grep家族由命令grep、egrep和fgrep组成。grep命令在文件中全局查找指定的正则表达式,并且打印所有包含该表达式的行。Egrep和fgrep都只是grep的变体。Egrep命令是扩展的grep,支持更多的正则表达式元字符。fgrep命令被称为固定grep(fixedgrep),有时也被称作快速grep(fast grep),它按字面解释所有的字符,也就是说,正则表达式元字符不会被特殊处理,它们只匹配自己。
自由软件基金会提供了grep的免费版本,称作GNU grep。Linux系统上使用的就是这种版本的grep。
1)grep
(1)grep (global search regular expression(RE)and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出
(2)grep的工作方式:它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用(双引号或者单引号),模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容
命令格式
grep word filename filename
范例1
grep tom /etc/passwd
说明:
grep将在文件/etc/passwd 中查找模式tom。如果查找成功,文件的相应行会显示在屏幕中,如果没有找到指定的模式,就不会有任何输出,如果所指定的文件不是一个合法文件,屏幕上会显示报错信息。如果发现要了查找的模式,grep返回的退出状态为0,表示成功,如果没找到,返回的退出状态就是1,而找不到指定的文件时,退出状态将是2.
grep程序的输入可以来自标准输入或管道,而不仅仅是文件。如果忘了指定文件,grep会以为你要它从标准输入(即键盘)获取输入,于是停下来等着你键入一些字符。如果输入来自管道,就会有另一条命令的输出通过管道编程grep命令的输入,如果匹配到要查找的模式,grep就会把输出打印在屏幕上。
范例2
ps –ef | grep root
说明
Ps命令的输出(ps –ef显示正在系统上运行的所有进程)被送到grep,然后包含root的行被打印在屏幕上。
1.1)元字符
元字符也是一种字符,但它表达的含义不同于字符本身的字面含义。例如,^和$就是元字符。
grep命令支持很多正在表达式元字符,以使用户更精确地定义要查找的模式。它提供了很多命令选项用于调整执行查找或显示结果的方式。例如,可以通过指定选项来关闭大小写敏感、要求显示行号,或者只显示报错信息等。
范例
grep –n ‘^jack:’/etc/passwd
说明
grep在文件/etc/passwd中查找jack,如果jack出现在某行的行首,grep就打印出改行的行号和内容。
grep使用的正则表达式元字符
^:锚定行首的符合条件的内容,用法格式“^pattern”;
$: 锚定行尾的符合条件的内容,用法格式“pattern$”;
^pattern$:
^$: 空白行
.: 匹配任意单个字符
*:匹配紧挨在其前面的字符任意次;
a*b: ab, aab, acb, b
.*: 匹配任意长度的任意字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[a-z], [A-Z], [0-9]
[:lower:] a-z
[:upper:]
[:digit:]
[:alpha:]
[:alnum:]
[:space:]
[:punct:]
grep "r[0-9].*h" /etc/passwd
\?: 匹配紧挨在其前面的字符0次或1次;
a\?b: ab, aab, acb, b
\{m,n\}: 匹配其前面的字符至少m次,至多n次;
\{0,n\}: 至多n次;0-n次;
\{m,\}:至少m次
\{m\}: 精确匹配m次;
a\{1,3\}b: b, ab, aab,aaab, aaaaaab, acb
grep"[bB].\{2,5\}[tT]": Boot, B123T, bxy12T
\<: 锚定词首,用法格式:\<pattern
\b: \bpattern
\>: 锚定词尾,用法格式:pattern\>
\b: pattern\b
\<pattern\>:锚定单词
\(\): 分组,用法格式: \(pattern\)
\(ab\)\{1,3\}: ab, aab,abb, abab, ababab,
ab任意字符ab:ab.*ab
a.b任意字符a.b: \(a.b\).*\1
1.2)grep的选项
--color=auto
exportGREP_COLOR='01;36'
-v:反向选取,只显示不符合模式的行;
-o:只显示被模式匹配到的字串,而不是整个行;
-i:不区分字符大小写;
-A#:显示匹配到的行时,顺带显示其后面的#个行;
-A2
-B#:前面的#行;
-C#:前后的#行;
-E: 使用扩展的正则表达式
grep-E = egrep
1.3)使用正则表达式实例
1、显示/proc/meminfo文件中以不区分大小写的s开头的行
# grep "^[Ss]" /proc/meminfo
2、显示/etc/passwd中以nologin结尾的行;
# grep "/sbin/nologin$"/etc/passwd
取出默认shell为/sbin/nologin的用户列表
# grep "/sbin/nologin$"/etc/passwd |awk -F: '{ print $1 }'
取出默认shell为bash,且其用户ID号最小的用户的用户名
#grep "/bin/bash$" /etc/passwd | sort -n -t: -k3 | head -1 | cut -d:-f1
3、显示/etc/rc.d/rc.sysinit中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
# grep"^#[[:space:]]\{1,\}[^[:space:]]" /etc/rc.d/rc.sysinit
4、显示/etc/rc.d/rc.sysinit中符合形为“任意单个字符n任意字符任意单个字符n”模式的行;即任意单个字符后面跟了个n,n后面有任意长度的任意字符,而后是任意单个字符后面跟了个n;
# grep ".n.*.n"/etc/rc.d/rc.sysinit
5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
# grep"^[[:space:]]\{1,\}" /boot/grub/grub.conf
2) egrep
使用egrep的主要好处是它在grep提供的正则表达式元字符集的基础上增加了更多的元字符。(linux系统,egrep=grep –E)
2.1) egrep使用的正则表达式元字符
^ :行首定位符
$:行尾定位符
.:匹配一个字符
*:匹配零个或多个前导字符
[]:匹配一组字符中的任意一个
[^]:匹配不在指定字符组内的字符
egrep 新增的元字符
+:匹配一个或多个加号前的字符
?:匹配零个或一个前导字符
a|b:匹配a或b
():字符组
2.2)egrep和grep –E实例
1.打印包含表达式NW或EA的行;
# egrep 'NW|EA' datafile
或# grep -E 'NW|EA' datafile
2.打印所有包含一个或多个3的行
# egrep '3+' datafile
3.打印所有一个2,后跟0个或1个句点,再接1个0~9之间的数的行
# egrep '2\.?[0-9]' datafil
4.打印包含一个或多个模式组no的行
# egrep '(no)+' datafile
5.打印所有包含一个或多个字母数字词字符(\w+),后跟一个或多个非字母数字词字符(\W+),再接上集合ABC中一个字母的行。
# egrep'\w+\W+[ABC]' datafile
6.打印所有包含Sh或u的行
# egrep 'Sh|u' datafile