grep命令简介:

    此命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

   egrep:  grep -e

   fgrep:   不支持正则表达式


1.命令格式:

   grep [options] PATTERN [FILE...]

       2.命令功能
   从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
   如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。


      3.主要参数

   -c:只输出匹配行的计数
   -i:不区分大 小写(只适用于单字符)            ***
   -h:查询多文件时不显示文件名
   -l:查询多文件时只输出包含匹配字符的文件名
   -n:显示匹配行及 行号
   -s:不显示不存在或无匹配文本的错误信息
   -v:显示不包含匹配文本的所有行--反向搜索       ***

   -o  只显示匹配的字符串

   --color: 彩色显示匹配符部分                 ***


grep:使用基本正则表达式定义的模式来过滤文本的命令;

    -E:  使用扩展正则表达式

    -A#:     after -A 2:匹配当前行和后2行

    -B#:     before -B 3:匹配当前行和前3行

    -C#:    context -C 4:匹配当前行和前后4行共9行

 

      支持正则表达式主要参数:

   \:  忽略正则表达式中特殊字符的原有含义。   转义符\
   ^:  匹配正则表达式的开始行。
   $:   匹配正则表达式的结束行。
   \<:  从匹配正则表达 式的行开始。
   \>:  到匹配正则表达式的行结束。
   [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。

   .:   匹配任意单个字符

   \?:   匹配其前面的字符1次或0次

   \{m,n\}: 匹配其前面的字符至少m次,至多n次

   []:   匹配指定范围内的任意单个字符

   [^]:  匹配指定范围外的任意单个字符

   字符集合:       

        [[:digit:]]   [0-9] 
        [[:lower:]]   [a-z]
        [[:upper:]]   [A-Z]

        [[:alnum:]]   [0-9a-zA-Z]


        [[:space:]]   空格或tab
        [[:alpha:]]   [a-zA-Z]

        [[:punct:]]   字符/符号

 

支持扩展正则表达式:-E选项  grep -E = egrep

  | : 或者表示符  比如a|bc|ca  表示a或者bc或者ca

  . :匹配任意单个字符

  []:匹配指定范围内的任意单个字符

 [^]:匹配指定范围外的任意单个字符


    * :匹配其前面的字符任意次(包括0次)

:匹配其前面的字符0次或者1次

 + :匹配其前面的字符至少1次            (相当于正则表达式中\{1,\})


 {m,n}: 直接使用大括号不用使用转移符\,表示至少m次,最多n次 

   {n} :匹配前面的字符n次


4.命令实例:

  实例一:*: 匹配其前面的字符任意次(贪婪模式)  

    [root@fox tmp]# cat 2.txt      a, b, ab, aab, acb, adb, amnb,amnbamnb,

    [root@fox tmp]#grep 'a.*b' 2.txt     ab, aab, acb, adb, amnb,amnbamnb,

    [root@fox tmp]#grep 'a\?b' 2.txt   b, ab, aab, acb, adb, amnb,amnbamnb,

    [root@fox tmp]#grep 'a*b' 2.txt    b, ab, aab, acb, adb, amnbamnbamnb

    [root@fox tmp]#grep 'a\{1,3\}b' 2.txt  ab, aab

    [root@fox tmp]#grep 'a.\{1,3\}b' 2.txt    aab, acb, adb, amnbamnbamnb


     --==>>> .*:任意长度的任意字符

     --==>>> \{ m,n\}有转义符grep看到  { m,n }为命令行展开


  实例二:位置锚定

    ^: 锚定行首,此字符后面的任意内容必须出现在行首

    $: 锚定行尾,此字符前面的任意内容必须出现在行尾

    ^$: 空白行

    \<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现

    \>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现

    [root@fox tmp]#grep 'w$' /etc/inittab

    ca::ctrlaltdel:/sbin/shutdown -t3 -r now


    [root@fox tmp]#grep 'b..h$' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    oracle:x:500:500:oracle:/home/oracle:/bin/bash


    [root@fox tmp]# grep '^$' /etc/inittab | wc -l
    9


    [root@fox tmp]# grep '[[:digit:]]$' /etc/inittab
    #   5 - X11
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    l2:2:wait:/etc/rc.d/rc 2
    1:2345:respawn:/sbin/mingetty tty1
    2:2345:respawn:/sbin/mingetty tty2


    [root@fox tmp]# cat grub.conf
    root (hd0,0)
    kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet
    initrd /initrd-2.6.18-164.el5.img
    [root@fox tmp]# grep 'quiet\b' grub.conf
    kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet


    # more size.txt | grep -i 'b1..*3'  忽略大小写
    b124230
    b103303
    B10223303


  实例三:分组

    \(\)

    \(ab\)*

    后向引用

    \1:引用第一个左括号以及与之对应的右括号所包括的所有内容

    \2:

    \3:

   

   [root@localhost ~]# cat test3
    He love his lover.
    She like her liker.
    He like his lover.
    She love her liker.
    she like him

   [root@localhost ~]# grep 'l..e' test3

    He love his lover.
    She like her liker.
    He like his lover.
    She love her liker.
    she like him

   [root@localhost ~]# grep 'l..e.*l..e' test3
    He love his lover.
    She like her liker.
    He like his lover.
    She love her liker.

   [root@localhost ~]# grep '\(l..e\).*\1' test3
    He love his lover.
    She like her liker.


   [root@localhost ~]# grep '\([0-9]\).*\1$' /etc/inittab
    #   5 - X11
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    l2:2:wait:/etc/rc.d/rc 2
    1:2345:respawn:/sbin/mingetty tty1
    2:2345:respawn:/sbin/mingetty tty2


  实例四:或者

    |: or

    C|cat:  C 或 cat   前后两个单词

    (C|c)at:  Cat 或 cat  分组

   grep -E = egrep

   grep --color -E '`[[:space:]]+' /boot/grub/grub.conf


  实例五IP地址查询

       表示点字符:\.  转义

       表示单引用:'' 

       示重复n次:{n}

# ifconfig | egrep --color  '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

    inet addr:35.109.231.195  Bcast:10.109.131.255  Mask:255.255.252.0
    inet addr:172.16.1.105  Bcast:172.16.1.255  Mask:255.255.255.0

    inet addr:172.16.1.106  Bcast:172.16.1.255  Mask:255.255.255.0
    inet addr:127.0.0.1  Mask:255.0.0.0


     eg1以下使用{n}表示重复前同字符

     # ifconfig | egrep --color  '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

    inet addr:35.109.231.195  Bcast:10.109.131.255  Mask:255.255.252.0
    inet addr:172.16.1.105  Bcast:172.16.1.255  Mask:255.255.255.0

    inet addr:172.16.1.106  Bcast:172.16.1.255  Mask:255.255.255.0
    inet addr:127.0.0.1  Mask:255.0.0.0


     eg2、以下使用-o表示只显示匹配部分

     # ifconfig | egrep --color -o '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
    35.109.231.195
    10.109.131.255

    255.255.252.0
    172.16.1.105

    172.16.1.255

    255.255.255.0

    172.16.1.106

    172.16.1.255

    255.255.255.0

    127.0.0.1

    255.0.0.0


     eg3以下表示A B C:1-223 三类地址

     # ifconfig | egrep  '\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]| [1-9][0-9]| 1[0-9][0-9]|2[0-4][0-9]| 25[0-4])\>'
    inet addr:127.0.0.1  Mask:255.0.0.0


     分析:\<([1-9] | [1-9][0-9] | 1[0-9]{2} |  2[01][0-9] | 22[0-3])\>

           个位 | 十位10-99 | 百位100-199 | 百位200-119 | 百位220-223


     A为一串字符时加括号: \<(A)\>   即:以A开始且以A结束

     [0-9]重复2次      1[0-9]{2}  即:100-199


  实例六:常用grep实例 

    (1) # ps -ef | grep in.telnetd 

    (2) # more size.txt | grep '[a-b]' 范围 ;如[A-Z]即A,B,C一直到Z都符合要求

    (3) # more size.txt | grep '[a-b]'* 

    (4) # more size.txt | grep '[bB]'  

    (5) # more size.txt | grep -iv 'b1..*3' -v :查找不包含匹配项的行  

    (6) # more size.txt | grep -in 'b1..*3'

    (7) # grep '$' /etc/init.d/nfs.server | wc -l

    (8) # grep '\$' /etc/init.d/nfs.server | wc –l 忽略正则表达式中特殊字符的原有含义

    (9) # grep '\$' /etc/init.d/nfs.server 


    (10)多个文件查询
        grep "sort" *.doc      #见文件名的匹配

    (11)行匹配:输出匹配行的计数
        grep -c "48" data.doc    #输出文档中含有48字符的行数

    (12)显示匹配行和行数
        grep -n "48" data.doc    #显示所有匹配48的行和行号

    (13)显示非匹配的行
        grep -vn "48" data.doc   #输出所有不包含48的行

    (14)显示非匹配的行
        grep -vn "48" data.doc   #输出所有不包含48的行

    (15)大小写敏感
        grep -i "ab" data.doc    #输出所有含有ab或Ab的字符串的行


    (16)正则表达式的应用 (注意:最好把正则表达式用单引号括起来)
        grep '[239].' data.doc    #输出所有含有以2,3或9开头的,并且是两个数字的行

    (17)不匹配测试
        grep '^[^48]' data.doc    #不匹配行首是48的行

    (18)使用扩展模式匹配
        grep -E '219|216' data.doc


    (19)grep '5[[:upper:]][[:upper:]]' data.doc   #查询以5开头以两个大写字母结尾的行


    (20)加()后是锚定整个字符串

# egrep '\<([1-9]| [1-9][0-9]| 1[0-9][0-9]| 2[0-4][0-9]| 25[0-5])\>'  /boot/grub/grub.conf --color     

timeout=5
title Red Hat Enterprise Linux Server (2.6.18-164.el5)
    kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet
    initrd /initrd-2.6.18-164.el5.img



附:关于grep和egrep的一些整理                    

grep:

格式: grep [option] pattern filename 注意: pattern如果是表达式或者超过两个单词的, 需要用引号引用. 可以是单引号也可双引号, 区别是单引号无法引用变量而双引号可以.

grep '\<Tom\>' file   包含单词Tom的行
grep 'Tom savage' file 包含Tom savage的行
grep '^Tommy' file 包含以Tommy开头的行
grep '\.bak$' file 包含以.bak结束的行
grep '[Pp]yramid' file 包含pyramid 或Pyramid的单词的行
grep '[A-Z]' file 包含至少一个大写字母的行
grep '[0-9]' file 包含至少一个数字的行
grep '[A-Z]...[0-9]' file 包含五个字符,以大写开头, 和一个数字结尾的行.
grep -w '[tT]est' file 包含单词和test的行.
grep -s 'ken sun' file 找到包含ken sun的行, 但不打印行, 而是用来检查退出状态.
grep -v aaa file 打印不包含aaa的行.
grep -i cathy file 打印所有包含cathy的行, 而不考虑大小些.
grep -l 'dear cathy' * 打印包含dear cathy的文件的文件名清单.
grep -n tom file   打印匹配的行并追加行号.
grep "$LOGNAME" file 包含变量内容的行, 注意必须用双引号, 单引号则无法引用变量.
grep '$name' file 打印包含字符$name的行.


egrep:

egrep = grep -E 可以使用基本的正则表达外, 还可以用扩展表达式. 注意区别.
扩展表达式:
+ 匹配一个或者多个先前的字符, 至少一个先前字符.
? 匹配0个或者多个先前字符.
a|b|c 匹配a或b或c
() 字符组, 如: love(able|ers) 匹配loveable或lovers.
(..)(..)\1\2 模板匹配. \1代表前面第一个模板, \2代第二个括弧里面的模板.
x{m,n} =x\{m,n\} x的字符数量在m到n个之间.

egrep '^+' file   以一个或者多个空格开头的行.
grep '^*' file   同上
egrep '(TOM|DAN) SAVAGE' file 包含 TOM SAVAGE 和DAN SAVAGE的行.
egrep '(ab)+' file 包含至少一个ab的行.
egrep 'x[0-9]?' file 包含x或者x后面跟着0个或者多个数字的行.
egrep 'fun\.$' * 所有文件里面以fun.结尾的行.
egrep '[A-Z]+' file 至少包含一个大写字母的行.
egrep '[0-9]' file 至少一个数字的行.
egrep '[A-Z]...[0-9]' file 有五个字符, 第一个式大写, 最后一个是数字的行.
egrep '[tT]est' file 包含单词test或Test的行.
egrep 'ken sun' file 包含ken sun的行.
egrep -v 'marry' file 不包含marry的行.
egrep -i 'sam' file 不考虑sam的大小写,含有sam的行.
egrep -l "dear ken" * 包含dear ken的所有文件的清单.
egrep -n tom file 包含tom的行, 每行前面追加行号.
egrep -s "$name" file 找到变量名$name的, 不打印而是显示退出状态. 0表示找到. 1表示表达式没找到符合要求的, 2表示文件没找到.


元字符描述
\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配字符“n”。“\\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。
^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
*匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
+匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
?匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
{n}n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,}n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
{n,m}m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
?当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o?”将匹配所有“o”。
.点匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。
(pattern)匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“”或“”。
(?:pattern)匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
(?=pattern)正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?<=pattern)反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern)反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
x|y匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
[xyz]字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz]负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z]字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
\d匹配一个数字字符。等价于[0-9]。
\D匹配一个非数字字符。等价于[^0-9]。
\f匹配一个换页符。等价于\x0c和\cL。
\n匹配一个换行符。等价于\x0a和\cJ。
\r匹配一个回车符。等价于\x0d和\cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\t匹配一个制表符。等价于\x09和\cI。
\v匹配一个垂直制表符。等价于\x0b和\cK。
\w匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
\W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\xn匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。
\num匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\n标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
\nml如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
\un匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号()。



---END---