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 }'

取出默认shellbash,且其用户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