grep,fgrep,egrep

来源:互联网 发布:java自学视频教程 编辑:程序博客网 时间:2024/04/29 11:31

转载:http://blog.chinaunix.net/uid-7374279-id-3849705.html

一、grep家族简介1、Unix的grep家族包括:grep、egrep和fgrep1)

1)grep

(1)grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出

(2)grep的工作方式:它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用(双引号或者单引号),模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容

(3)linux是使用GNU版本的grep,它的功能更强,可以通过-G(默认参数)、-E、-F命令行选项来使用egrep和fgrep的功能
grep  -E  <=>  egrep
grep  -F  <=>  fgrep

(4)grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。所以我们利用这些返回值就可进行一些自动化的文本处理工作

2)egrep
egrep命令只跟grep有很小的不同,egrep是grep的扩展,支持更多的re元字符

3)fgrep
fgrep的命令只跟grep有很小的不同, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊
二、grep正则表达式元字符集(基本集)

^

匹配行首,例如:’^grep’匹配所有以grep开头的行

$

匹配行尾,例如:’grep$’匹配所有以grep结尾的行

.

匹配一个非换行符的字符,例如:’gr.p’匹配gr后接一个任意字符,然后是p

*

匹配零个或多个先前字符,例如:’*grep’匹配所有一个或多个空格后紧跟grep的行;.*一起用代表任意字符

[ ]

匹配一个指定范围内的字符,例如:’[Gg]rep’匹配Grep和grep

[^ ]

匹配一个不在指定范围内的字符,例如:’[^A-FH-Z]rep’匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行

\(..\)

标记匹配字符,例如:’\(love\)’,love被标记为1

\<

匹配单词的开始,例如:’\<grep’匹配包含以grep开头的单词的行

\>

匹配单词的结束,例如:’grep\>‘匹配包含以grep结尾的单词的行

x\{m\}

重复字符x,m次,例如:’o\{5\}’匹配包含5个o的行

x\{m,\}

重复字符x,至少m次,例如:’o\{5,\}’匹配至少有5个o的行

x\{m,n\}

重复字符x,至少m次,不多于n次,例如:’o\{5,10\}’匹配5–10个o的行

\w

匹配文字和数字字符,也就是[A-Za-z0-9],例如:’G\w*p’匹配以G后跟零个或多个文字或数字字符,然后是p

\W

匹配一个或多个非单词字符,例如:点号句号等

\b

单词边界符,例如:’\bgrepb\’,只匹配grep

\B

单词非边界符,例如:’\Bok’,不能匹配grep单词,而能匹配book


三、用于egrep和 grep -E的元字符扩展集

+    

匹配一个或多个先前的字符,例如:’[a-z]+able’,则匹配一个或多个小写字母后跟able的串:loveable,enable,disable等

?

匹配零个或多个先前的字符,例如:’gr?p’,则匹配gr后跟一个或没有字符,然后是p的行

a|b|c

匹配a或b或c,例如:(grep)|(sed),则匹配grep或sed

()

分组符号,如:love(able|rs)ov+,则匹配loveableov或loversov

x{m},x{m,},x{m,n} ó  x\{m\},x\{m,\},x\{m,n\}


四、POSIX字符类

为了在不同国家的字符编码中保持一致,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是A-Za-z0-9的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。

[:alnum:]

匹配任何一个字母或数字([A-Za-z0-9])

[:alpha:]

匹配任何一个字母([A-Za-z])

[:digit:]

匹配任何一个数字([0-9])

[:lower:]

匹配任何一个小写字母([a-z])

[:upper:]

匹配任何一个大写字母([A-Z])

[:space:]

任何一个空白字符:制表符、空格

[:blank:]

空格和制表符(横向和纵向),等价于'[\s\t\v]'

[:graph:]

任何一个可看得见且可打印的字符(注意:不包括空格和换行符等)

[:print:]

任何一个可以打印的字符(注意:不包括[:cntrl:], 但包括空格符号)

[:cntrl:]

任何一个控制字符(ASCII字符集中的前 32 个字符,即:用十进制
表示为从 0 到 31,例如:换行符、制表符等等)

[:punct:]

任何一个标点符号(不包括:[:alnum:]、[:cntrl:]、[:space:]字符集)

[:xdigit:]

任何一个十六进制数(即:0-9,a-f,A-F)

五、grep命令选项

grep  [options]  PATTERN   [FILE...]

grep  [options]  [ -e PATTERN  |  -f  FILE] [FILE... ]

-A num

num必须是正整体或0,即:同时显示匹配行向下的num行,例如:grep -A  3  ‘dog’  FILE同时显示匹配行的向下3行

-B num

num必须是正整体或0,即:同时显示匹配行向上的num行,例如:grep -B 3 ‘dog’  FILE同时显示匹配行的向上3行

-num

num必须是正整体或0,即:同时显示匹配行上下的num行,例如:grep  -3  pattern  filename同时显示匹配行的上下3行

--color=WHEN
--colour=WHEN

WHEN必须是:auto、always、never三个中的其中一个,表示搜索到的关健字以颜色方式显示

-r,-R,--recurse,-d  recurse

如果FILE字段给的是一个目录,那么以递归的方式对该目录下的所有文件进行匹配搜索关健字(即:将遍历目录下的所有子目录中的文件);如果FILE字段给的是一个文件,那么就只对文件进行匹配搜索关健字

-E

即:使用egrep指令(作用:使用Extended Regular Expression)

-F

即:使用fgrep指令(作用:匹配搜索关健字时,将关健字中的元字符都按普通字符来匹配搜索,不使用Regular Expression)

-G

即:使用Basic Regular Expression

-P

即:使用Perl Regular Expression

-H

在匹配到的行的开头,追加上该行所在的文件的文件名(即:打印文件名)

-b,--byte-offset

显示匹配到的行之前的所有内容所占的字节大小(单位为bytes),例如:grep  -b  ‘dog’  filename,即:显示含有dog的行之前的那些行的内容所占的字节大小

-c,--count

只打印匹配的行数,不显示匹配的内容

-f  File,--file=File

把模板(pattern)写在一个文件里,然后使用-f参数来读取这些pattern,如果文件中包含0个pattern,那么什么都不匹配;如果有多个pattern,那么必须一行写一个pattern,即:pattern一般是带有regular expression的表达式

-h,-- no-filename

当搜索多个文件时,不显示匹配文件名前缀

-i,--ignore-case

忽略大小写差别

-q,--quiet

取消显示,只返回退出状态;0则表示找到了匹配的行

-l,--files-with-matches

打印匹配pattern的文件清单,例如:grep –L 'bug'   /etc/animal /etc/ruanxi    /etc/grub.conf,那么如果只有/etc/animal文件中的内容匹配pattern('bug'),那么使用-l参数就只显示匹配的文件清单:/etc/animal

-L,--files-without-match

打印不匹配pattern的文件清单,例如:grep –L 'bug'    /etc/animal /etc/ruanxi    /etc/grub.conf,那么如果只有/etc/animal文件中的内容匹配pattern(即:'bug'),那么使用-L参数就显示不匹配的文件清单:/etc/ruanxi、/etc/grub.conf

-n,--line-number

在匹配的行前面显示行号

-s,--no-messages

不显示关于不存在或者无法读取文件的错误信息

-v,--revert-match

反检索,只显示不匹配的行

-w,--word-regexp

如果被\<和\>引用,就把表达式做为一个单词搜索

-o,--only-matching

显示满足匹配的字符串,例如下面这个例子
root@monitor:~# cat -n file
1  how are you today?
2  i don't know
3  what can i do for you?
4  nice to meet you
root@monitor:~# cat file | grep -n -o meet
4:meet

0 0
原创粉丝点击