功能说明:在文件内查找指定的字符串。egrep执行效果如grep -E,使用的语法及参数可参照grep指令,与grep不同点在于解读字符串的方法,egrep是用extended regular expression语法来解读,而grep则用basic regular expression语法,extended regular expression比basic regular expression有更完整的表达规范。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
grep、fgrep 和 egrep 命令 比较
grep的一般格式为:
grep [选项] 基本正则表达式 [文件]
在grep命令中输入字符串参数时,最好将其用双引号括起来。例如:“my strings”,这样做有两个原因,一个是防止被误会是shell命令,一个是可以用来查找多个单词组成的字符串,就如这个例子中的“my strings”。
在调用变量的时候,也应该使用双引号,例如:grep “$MYNAME”。
在调用模式匹配时,应该使用单引号。
grep命令中的常用选项:
-c 只输出匹配的行数。
-i 不区分大小写。
-h 查询多个文件时不显示文件名。
-l 查询文件时只显示匹配字符所在的文件名。
-n 显示匹配的行及其行号。
-s 不显示不存在或不匹配文本的错误信息。
-v 显示不匹配的所有行。
-E 允许使用扩展模式匹配。例如:grep -E ’00|04′ findfile,表示在findfile文件中查询包含00或04的行。
grep允许使用国际字符模式匹配。类名及其等价的正则表达式:
类 正则表达式
[[:upper:]] [A-Z]
[[:lower:]] [a-z]
[[:digit:]] [0-9]
[[:alnum:]] [0-9a-zA-Z]
[[:space:]] 空格或tab键
[[:alpha:]] [a-zA-Z]
grep、fgrep和egrep命令
这组命令以指定模式搜索文件,并通知用户在什么文件中搜索到与指定的模式匹配的字符串,并打印出所有包含该字符串的文本行,在该文本行的最前面是该行所在的文件名。grep命令一次只能搜索一个指定的模式;egrep命令检索扩展的正则表达式(包括表达式组和可选项);fgrep命令检索固定字符串,它不识别正则表达式,是快速搜索命令。
这组命令在搜索与定位文件中特定的主题方面非常有用。要搜索的模式可以被认为是一些关键词,您可以用它们来搜索文件中包含的这些关键词。编写程序时,可以用它来寻找某一个函数,或是相关的词组。grep命令的搜索功能比fgrep强大,因为grep命令的搜索模式可以是正则表达式,而fgrep却不能。有关正则表达式请参见shell一章。
该组命令中的每一个命令都有一组选项,利用这些选项可以改变其输出方式。例如,可以在搜索到的文本行上加入行号,或者只输出文本行的行号,或者输出所有与搜索模式不匹配的文本行,或只简单地输出已搜索到指定模式的文件名,并且可以指定在查找模式时忽略大小写。
这组命令在指定的输入文件中查找与模式匹配的行。如果没有指定文件,则从标准输入中读取。正常情况下,每个匹配的行被显示到标准输出。如果要查找的文件是多个,则在每一行输出之前加上文件名。
语法:
grep [选项] [查找模式] [文件名1,文件名2,……]
egrep [选项] [查找模式] [文件名1,文件名2,……]
fgrep [选项] [查找模式] [文件名1,文件名2,……]
这组命令各选项的含义为:
- E 每个模式作为一个扩展的正则表达式对待。
- F 每个模式作为一组固定字符串对待(以新行分隔),而不作为正则表达式。
- b在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量。
- c 只显示匹配行的数量。
- i 比较时不区分大小写。
- h 在查找多个文件时,指示grep不要将文件名加入到输出之前。
- l 显示首次匹配串所在的文件名并用换行符将其隔开。当在某文件中多次出现匹配串时,不重复显示此文件名。
- n 在输出前加上匹配串所在行的行号(文件首行行号为1)。
- v 只显示不包含匹配串的行。
- x 只显示整行严格匹配的行。
- e expression 指定检索使用的模式。用于防止以“-”开头的模式被解释为命令选项。
- f expfile 从expfile文件中获取要搜索的模式,一个模式占一行。
对该组命令的使用还需注意以下方面:
用户可以在命令行上用Shell特殊字符来生成将要搜索的文件名列表。在下面的例子中,特殊字符“*”用来生成一个文件名列表,该列表包含当前目录下所有的文件。该命令将搜索出当前目录下所有文件中与模式匹配的行。
$ grep data *
grep的使用详解一
48 Dec 3BC1997 LPSX 68.00 LVX2A 138
483 Sept 5AP1996 USP 65.00 LVX2C 189
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
487 may 5PA1998 USP 37.00 KVM9D 644
471 May 7Zh1999 UDP 37.00 KV30D 643
)
4
487 may 5PA1998 USP 37.00 KVM9D 644
471 May 7Zh1999 UDP 37.00 KV30D 643
487 may 5PA1998 USP 37.00 KVM9D 644
471 May 7Zh1999 UDP 37.00 KV30D 643
1:48 Dec 3BC1997 LPSX 68.00 LVX2A 138
2:483 Sept 5AP1996 USP 65.00 LVX2C 189
5:484 nov 7PL1996 CAD 49.00 PLV2C 234
6:487 may 5PA1998 USP 37.00 KVM9D 644
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
471 May 7Zh1999 UDP 37.00 KV30D 643
471 May 7Zh1999 UDP 37.00 KV30D 643
48 Dec 3BC1997 LPSX 68.00 LVX2A 138
注:tab键,安一下tab键即可;和精确显示输出的结果是相同的)
48 Dec 3BC1997 LPSX 68.00 LVX2A 138
483 Sept 5AP1996 USP 65.00 LVX2C 189
484 nov 7PL1996 CAD 49.00 PLV2C 234
即:单引号、和双引号是通用的,只要你养成一种习惯就好)
483 Sept 5AP1996 USP 65.00 LVX2C 189
484 nov 7PL1996 CAD 49.00 PLV2C 234
219 dec 2CC1999 CAD 23.00 PLV2C 68
487 may 5PA1998 USP 37.00 KVM9D 644
471 May 7Zh1999 UDP 37.00 KV30D 643
48 Dec 3BC1997 LPSX 68.00 LVX2A 138
483 Sept 5AP1996 USP 65.00 LVX2C 189
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
487 may 5PA1998 USP 37.00 KVM9D 644
471 May 7Zh1999 UDP 37.00 KV30D 643
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
487 may 5PA1998 USP 37.00 KVM9D 644
471 May 7Zh1999 UDP 37.00 KV30D 643
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
487 may 5PA1998 USP 37.00 KVM9D 644
# grep “5..1998” zhao.conf
487 may 5PA1998 USP 37.00 KVM9D 644
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
487 may 5PA1998 USP 37.00 KVM9D 644
#
487 may 5PA1998 USP 37.00 KVM9D 644
219 dec 2CC1999 CAD 23.00 PLV2C 68
471 May 7Zh1999 UDP 37.00 KV30D 643
48 Dec 3BC1997 LPSX 68.00 LVX2A 138
483 Sept 5AP1996 USP 65.00 LVX2C 189
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
487 may 5PA1998 USP 37.00 KVM9D 644
471 May 7Zh1999 UDP 37.00 KV30D 643
grep的使用二
drwxr-xr-x 2 root other 512 11月 25 22:41 ldap
#
-rw-r–r– 1 root other 4987 11月 25 23:22 grep.log
-rw-r–r– 1 root other 0 11月 26 22:34 grep.log2
-rw-r–r– 1 root other 267 11月 19 19:37 ifconfig
#
drwxr-xr-x 2 root other 512 11月 25 22:41 ldap
#
mailsrv:x:101:3:iplanet mail user:/iplanet/server5/bin/msg/admin/bin:/bin/sh
#
# (抽出/etc/passwd中“mailsrv”的用户信息输出到一个文件(mailsrv.log)中)
mailsrv:x:101:3:iplanet mail user:/iplanet/server5/bin/msg/admin/bin:/bin/sh
#
root 321 165 0 22:29:33 ? 0:00 in.telnetd
root 638 434 0 23:35:38 pts/1 0:00 grep telnet
root 321 165 0 22:29:33 ? 0:00 in.telnetd
#
48 Dec 3BC1997 LPSX 68.00 LVX2A 138
483 Sept 5AP1996 USP 65.00 LVX2C 189
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
487 may 5PA1998 USP 37.00 KVM9D 644
471 May 7Zh1999 UDP 37.00 KV30D 643
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
4 28 224
在UNIX中字处理是一件很烦琐的事情,但这些字处理工具给我们带来了很大的方便;这里grep、egrep(扩展grep,在一些UNIX中
也存在)仅仅是一种工具。但其能灵活的抽出你需要的东东。它将随着你对UNIX的理解程度,逐步变成你手头不可缺少的一个工具
其在shell编程中同样具有举足轻重的位置。grep、egrep和其他字处理工具的组合使用更为灵活、深澳!
————–
grep能找出带有关键字的行,但是工作中有时需要找出该行前后的行,下面是解释
找出filename中带有keyword的行,输出中除显示该行外,还显示之后的一行(After 1)
找出filename中带有keyword的行,输出中除显示该行外,还显示之前的一行(Before 1)
找出filename中带有keyword的行,输出中除显示该行外,还显示之前的一行(After 1)和显示之后的一行(After 1)