`
zhengdl126
  • 浏览: 2542490 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

grep与egrep

阅读更多

http://bbs.chinaunix.net/thread-446683-1-1.html


比方以 grep 来说, 在 Linux 上你可找到 grep, egrep, fgrep 这几个程序, 其差异大致如下:

 

* grep:
传统的 grep 程序, 在没有参数的情况下, 只输出符合 RE 字符串之句子. 常见参数如下:
-v: 逆反模示, 只输出"不含" RE 字符串之句子.
-r: 递归模式, 可同时处理所有层级子目录里的文件.
-q: 静默模式, 不输出任何结果(stderr 除外. 常用以获取 return value, 符合为 true, 否则为 false .)
-i: 忽略大小写.
-w: 整词比对, 类似 \<word\> .
-n: 同时输出行号.
-c: 只输出符合比对的行数.
-l: 只输出符合比对的文件名称.
-o: 只输出符合 RE 的字符串. (gnu 新版独有, 不见得所有版本都支持.)
-E: 切换为 egrep .

* egrep:
为 grep 的扩充版本, 改良了许多传统 grep 不能或不便的操作. 比方说:
- grep 之下不支持 ? 与 + 这两种 modifier, 但 egrep 则可.
- grep 不支持 a|b 或 (abc|xyz) 这类"或一"比对, 但 egrep 则可.
- grep 在处理 {n,m} 时, 需用 \{ 与 \} 处理, 但 egrep 则不需.
诸如此类的... 我个人会建议能用 egrep 就不用 grep 啦... ^_^

* fgrep:
不作 RE 处理, 表达式仅作一般字符串处理, 所有 meta 均失去功能.

 


[ade]表示a,d或e

[^]表示除[]内的字符之外的字符

 

-----------------------实例


在递归目录文件中查找字符串
grep -r "test" ./

 

 
从/etc/vsftpd/vsftpd.conf  里面 筛选 yes/YES 的行  出来,怎么筛选
grep -i 'yes' /etc/vsftpd/vsftpd.conf

 

grep "chin" 1.txt
查找字符 chin 的行内容(多行)


$grep -n "chin" 1.txt  显示行号
3:    2 chin 102 20040129
5:4 chin 444


grep -c "chin" 1.txt 共出现几行


grep -v "chin" 1.txt  显示所有不包含4 8的各行

在上一例中,抽取字符串“ 4 8”,返回结果包含诸如4 8 4和4 8 3等包含“4 8”的其他字符串,实际上应精确抽取只包含4 8的各行。
使用g r e p抽取精确匹配的一种更有效方式是在抽取字符串后加\ >。假定现在精确抽取4 8,方法如下:
$grep "48\>" data.f


<Tab>表示点击t a b键。
$grep "48<tab>" data.f


grep是大小写敏感的,如要查询大小写不敏感字符串,必须使用- i开关

模式范围 grep和正则表达式
$grep "48[34]" data.f
483     Sept    5AP1996 USP     65.00   LVX2C   189
484     nov     7PL1996 CAD     49.00   PLV2C   234
483     may     5PA1998 USP     37.00   KVM9D   644




使行首不是4或8,可以在方括号中使用^记号。
$ grep "^[^48]" data.f
如果是字符串48
$ grep -v "^[^48]" data.f



也可以用另一种方式[ ]模式抽取各行包含S e p t和s e p t的所有信息。
$ grep '[sS]ept' data.f

如果要抽取包含S e p t的所有月份,不管其大小写,并且此行包含字符串483,可以使用管道命令,即符号“|”左边命令的输出作为“ |”右边命令的输入。举例如下:
$ grep '[sS]ept' data.f | grep 48



如果抽取以K开头,以D结尾的所有代码,可使用下述方法,因为已知代码长度为5个字符:
grep 'K...D' data.f
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
483     may     5PA1998 USP     37.00   KVM9D   644


将上述代码做轻微改变,头两个是大写字母,中间两个任意,并以C结尾:
$ grep '[A-Z]..C' data.f
483     Sept    5AP1996 USP     65.00   LVX2C   189
219     dec     2CC1999 CAD     23.00   PLV2C   68
484     nov     7PL1996 CAD     49.00   PLV2C   234



一个常用的查询模式是日期查询。先查询所有以5开始以1 9 9 6或1 9 9 8结尾的所有记录。使用模式5 . . 1 9 9 [ 6 , 8 ]。这意味着第一个字符为5,后跟两个点,接着是1 9 9,剩余两个数字是6或8。
$ grep '5..199[6,8]' data.f
483     Sept    5AP1996 USP     65.00   LVX2C   189
483     may     5PA1998 USP     37.00   KVM9D   644



必须学会使用[ ]抽取信息。假定要取得城市代码,第一个字符为0-9,第二个字符在0到5之间,第三个字符在0到6之间,使用下列模式即可实现。
$ grep '[0-9][0-5[0-6]' data.f



抽取包含数字4至少重复出现两次的所有行,方法如下:
$ grep '4\{2,\}' data.f
483     may     5PA1998 USP     37.00   KVM9D   644

抽取记录使之包含数字9 9 9(三个9),方法如下:
$ grep '9\{3,\}' data.f


$ grep '8\{2,6\}3' myfile
888883
88883


使用grep匹配“与”或者“或”模式
g r e p命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:
$ grep -E '219|216' data.f
219     dec     2CC1999 CAD     23.00   PLV2C   68
216     sept    3ZL1998 USP     86.00   KVM9E   234



空行
结合使用^和$可查询空行。使用- c参数显示总行数:
$ grep -c '^$' myfile
使用- n参数显示实际在哪一行:
$ grep -c '^$' myfile


查询有特殊含义的字符,诸如$ . ' " * [] ^ | \ + ? ,必须在特定字符前加\。假设要查询包含“.”的所有行,脚本如下:
$ grep '\.' myfile


使用正则表达式可匹配任意文件名。系统中对文本文件有其标准的命名格式。一般最多六个小写字符,后跟句点,接着是两个大写字符。
$ grep '^[a-z]\{1,6\}\.[A-Z]\{1,2\}' filename

--------------------------------------


$ cat /etc/passwd | grep guru
正确的方法应该是:
$ grep guru /etc/passwd


------------------------g r e p允许使用国际字符模式匹配或匹配模式的类名形式。
类名及其等价的正则表达式类等价的正则表达式类等价的正则表达式



[ [ : u p p e r : ] ]  ==> [ A - Z ]
[ [ : a l n u m : ] ]  ==> [ 0 - 9 a - zA-Z]
[ [ : l o w e r : ] ]  ==> [ a - z ]
[ [ : s p a c e : ] ]  ==> 空格或t a b键
[ [ : d i g i t : ] ]  ==> [ 0 - 9 ]
[ [ : a l p h a : ] ]  ==> [ a - z A - Z ]


取以5开头,后跟至少两个大写字母:
$grep '5[[:upper:]][[:upper]]' data.f


取以P或D结尾的所有产品代码:
grep '[[:upper:]][[:upper:]][P,D]' data.f


使用通配符*的匹配模式
grep "l.*s" testfile


如在行尾查询某一单词,试如下模式:
grep "ng$" testfile  这将在所有文件中查询行尾包含单词ng的所有行


使用g r e p命令- s开关,可屏蔽错误信息。
如果g r e p命令不支持- s开关,可替代使用以下命令:
# grep "sam" /tec/password >/dev/null 2>&1
脚本含义是匹配命令输出或错误( 2 > $ 1),并将结果输出到系统池。大多数系统管理员称/ d e v / n u l l为比特池,没关系,可以将之看成一个无底洞,有进没有出,永远也不会填满。



如要保存g r e p命令的查询结果,可将命令输出重定向到一个文件。
# grep "sam" /etc/passwd >/usr/sam/passwd.out
# cat /usr/sam/passwd.out
sam:x:506:4::/usr/sam:/bin/bash




g r e p不只应用于文件,也可应用于字符串。为此使用e c h o字符串命令,然后对g r e p命令使用管道输入。
# STR="Mary Joe Peter Pauline"
# echo $STR | grep "Mary"









--------------------egrep代表e x p r e s s i o n或extended grep,适情况而定。
e g r e p接受所有的正则表达式, e g r e p的一个显著特性是可以以一个文件作为保存的字符串,然后将之传给e g r e p作为参数,为此使用- f开关。


创建一个名为g r e p s t r i n g s的文件,并输入4 8 4和4 7:

# vi grepstrings
# cat grepstrings
484
47


egrep -f grepstrings data.f
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
484     nov     7PL1996 CAD     49.00   PLV2C   234



如果要查询存储代码3 2 L或2 C C,可以使用(|)符号,意即“|”符号两边之一或全部。
$egrep '(3ZL|2CC)' data.f
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
219     dec     2CC1999 CAD     23.00   PLV2C   68
216     sept    3ZL1998 USP     86.00   KVM9E   234



可以使用任意多竖线符“ |”,例如要查看在系统中是否有帐号l o u i s e、m a t t y或pauline ,使用w h o命令并管道输出至e g r e p。
$who |egrep (louise|matty|pauline)


还可以使用^符号排除字符串。如果要查看系统上的用户,但不包括m a t t y和p a u l i n e,方法如下:
$who |egrep -v '^(matty|pauline)'


如果要查询一个文件列表,包括s h u t d o w n、s h u t d o w n s、r e b o o t和r e b o o t s,使用e g r e p可容易地实现。
$egrep '(shutdown |reboot) (s)?' *





分享到:
评论

相关推荐

    Linux中grep和egrep命令详解

    egrep命令的语法与grep基本相同,但默认就支持了更多的正则表达式特性。 例如,要查找所有包含数字的行,可以使用: ```bash grep '[0-9]' /etc/inittab ``` 同样,要过滤出所有不包含数字的行,可以使用: ```...

    正则表达式

    #### grep与egrep - **grep**:默认使用BREs,通过`-E`选项使用EREs,通过`-P`选项使用PREs。 - **egrep**:默认使用EREs,通过`-P`选项使用PREs。 - **特点**: - 处理对象:文本文件。 - 处理过程:查找文本...

    linux grep与正则表达式使用介绍

    Unix的grep家族包括grep、egrep和fgrep。Windows系统下类似命令FINDSTR。 grep egrep fgrep(不支持正则表达式) grep需要标准输入 因此常常位于管道右侧 命令参数: –color=auto: 对匹配到的文本着色显示 -v: 显示不...

    正则表达式全解.pdf

    1. **grep与egrep文本工具** - **grep** 支持BREs、EREs和PREs,具体使用哪种正则表达式取决于命令行参数。 - 不带参数,默认使用BREs。 - 使用`-E`参数时,使用EREs。 - 使用`-P`参数时,使用PREs。 - **egrep...

    linux grep 2.5.1源码

    grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep

    grep正则表达使用简介

    在 Unix 系统中,grep 有三个变体:grep、egrep 和 fgrep。egrep 是 grep 的扩展,支持更多的正则表达式元字符;fgrep 即 fixed grep,它不解析正则表达式,而是将搜索模式视为固定字符串。 在 Linux 中,通常使用...

    Grep学习笔记.pdf

    Grep的家族包括三种不同的工具:grep、egrep和fgrep。其中,egrep是grep的增强版,支持更多的正则表达式元字符;而fgrep则是一种快速的grep,它将所有字符视为普通字符,不考虑正则表达式的特殊含义。 在Linux环境...

    egrep的元字符总结

    `egrep`是`grep`的一个扩展版本,主要用于文本搜索,它支持正则表达式进行模式匹配,这使得它在处理复杂的文本匹配任务时更加灵活和强大。本文将对`egrep`中的元字符进行详细总结,并通过具体的例子帮助理解这些元...

    Grep Pocket Reference

    `grep`是一个强大的文本搜索工具,在Unix和类Unix操作系统中广泛使用,用于查找与指定模式匹配的行。 ### `grep`简介 `grep`来源于“Global Regular Expression Print”的缩写,最初由Ken Thompson在1973年为UNIX...

    浅谈Linux grep与正则表达式

    通常grep有三种版本grep、egrep(等同于grep -E)和fgrep。egrep为扩展的grep,fgrep则为快速grep(固定的字符串来对文本进行搜索,不支持正则表达式的引用但是查询极为快速)。grep是Linux文本处理三剑客之一。 ...

    egrep程序c++/bison/flex实现

    `egrep`是用于在文本文件中搜索指定模式的工具,基于正则表达式,它是`grep`命令的一个增强版本。 首先,让我们了解C++,这是一种通用的、面向对象的编程语言,具有高效性、灵活性和广泛的库支持。在本项目中,C++...

    linuxgrep命令.pdf

    - 可以结合 egrep(grep -E)使用扩展正则表达式,或使用 fgrep(grep -F)来进行文本匹配,不解释正则表达式。 7. 与管道结合使用: - grep 命令经常与其他命令一起使用,如 ps 命令配合 grep 搜索特定进程,cat...

    grep用法总法

    - **-y**:忽略大小写差异,与 `-i` 类似,但只应用于 `-w` 模式。 #### 六、示例说明 1. **基本用法** ```bash grep "pattern" file.txt ``` 在 `file.txt` 文件中搜索包含 "pattern" 的行。 2. **忽略大...

    Linux Grep命令使用的详细介绍

    在Unix系统中,grep家族还包括了egrep和fgrep两个变体,egrep提供了对更多正则表达式元字符的支持,而fgrep则是将所有字符视为固定字符串,不考虑元字符的特殊含义。 在Linux中,通常使用的是GNU版本的grep,它拥有...

    unix的grep命令

    2. **Egrep**:扩展`grep`,支持更广泛的正则表达式特性,包括扩展正则表达式(ERE)。 3. **Fgrep**:快速`grep`,用于精确字符串匹配,而不是模式匹配。 #### 三、命令格式 `grep`的一般格式为: ``` grep [选项] ...

    Indesign_GREP正则表达式

    在egrep和grep-E中,还有一些额外的元字符可供使用,如: - `+`:匹配一个或多个先前的字符。 - `?`:匹配零个或多个先前的字符。 - `|`:表示选择,即匹配左侧或右侧的表达式。 - `{m}`、`{m,}`、`{m,n}`:分别...

    grep命令调研文档

    在 Linux 系统中,默认安装的是 GNU 版本的 Grep,该版本提供了丰富的功能,并允许用户通过命令行选项 `-G`、`-E` 和 `-F` 来分别使用 fGrep、eGrep 和标准 Grep 的功能。Grep 在执行时不会对原文件内容造成任何改变...

    使用 grep 命令搜索多个字符串.doc

    grep 命令是 Linux 系统中一个强大的命令行工具,它允许在一个或多个文件中搜索与正则表达式匹配的行,并将匹配的结果写入标准输出。grep 命令支持三种正则表达式语法:Basic、Extended 和 Perl 正则表达式。当没有...

Global site tag (gtag.js) - Google Analytics