PDF: grep中文手册 ----- http://download.csdn.net/detail/u011130746/7225351
GNU Grep: Print lines matching a pattern
译:hap.ddup@gmail.com
-
grep手册(grep,是一个规则匹配引擎.)
Copyright©1999-2002,2005, 2008-2012 Free Software Foundation, Inc.
遵循GNU自由文档许可条款,用户可以复制,发布,修改该文档内容,1.3版或 最新版由自由软件组织(FSF)发布;没有固定段落,没有封面文字,没有封底文字. “GNU Free Documentation License”部分包含证书副本
1.简介
grep可根据提供的匹配模式列表,查询文件中的匹配行.发现匹配行后,行内容会被标准输出(默认),如果使用了其他参数选项,可产生其他格式的输出。
grep用于匹配文本,它对输入行的长度没有限制,除非受限于可用内存大小,并且它可以匹配行内任意字符。
2.调用grep
grep命令行方法如下:
grepoptions pattern input_file_names
可以不指定或指定多个option选项。如果不采用'-epattern'或'-ffile',那么pattern就是我们所见的内容。同样的,我们可以不指定或指定多个input_file_names选项。
2.1命令行选项
grep有很多参数:一些源于POSIX,一些是GNU的扩展。长参数名,通常是GNU的扩展,这些参数甚至来源于POSIX。POSIX标准的短文件名,是为了方便进行POSIX移植而设计的。部分参数还提供老版本及特殊情况的兼容。
2.1.1常规程序信息
--help | 打印命令行帮助信息,bug报告地址,并退出程序. |
|
|
-V --version | 打印grep版本号,bug报告中应该包含此版本号。 |
2.1.2匹配控制
-epattern --regexp=pattern | 可指定多个查询规则,或使用'-'保护匹配规则 |
|
|
-ffile --file=file | 从文件中获取匹配规则,一行表示一个规则,空文件不包含规则,因此不匹配任何内容 |
|
|
-i -y --ignore-case | 忽略匹配规则和输入文件中的大小写 |
|
|
-v --invert-match | 获取未匹配的行 |
|
|
-w --word-regexp | 获取包含整个词的匹配行,词由字母,数字,下划线组成 |
|
|
-x --line-regexp | 整行匹配 |
2.1.3常规输出控制
-c --count | 输出文件的匹配行数,而非匹配内容的常规输出.与'-v'参数一起使用,可统计未匹配的行数. |
|
|
--color[=WHEN] --colour[=WHEN] | 颜色值可通过环境变量GREP_COLORS定义,默认是'ms=01;31:mc=01;31:sl=:cx=:fn=35:ln=32:bn=32:se=36',WHEN值可设置为never,always, auto. |
|
|
-L --files-without-match | 仅输出未匹配的文件名 |
|
|
-l --files-with-matches | 仅输入匹配文件名 |
|
|
-m num --max-count=num | 匹配num行后,停止读取文件.当与'-c'或'--count'一起使用时,输出的匹配行计数不会大于num,与'-v'或'--invert-match'一起使用时,会输入num次匹配过程中的未匹配项. |
|
|
-o --only-matching | 打印行内匹配的内容(非空) |
|
|
-q --quite --silent | 不做标准输出.如果发现匹配项,立即退出,即使中间出现错误。 |
|
|
-s --no-messages | 针对不存在或不可读的文件,不输出错误信息 |
2.1.4输出行前缀控制
前缀输出,通常有文件名,行号,字节偏移,可通过下面参数指定.
-b --byte-offset | 在每行输出内容的前面,打印字符偏移 |
|
|
-H --with-filename | 在匹配内容前,打印文件名,查询多个文件时,这是默认设置. |
|
|
-h --no-filename | 输出时,不打印文件名,查询单个文件时,这是默认设置 |
|
|
--label=LABEL | 使用标签,将标准输入以文件输入的方式表示 gzip-cd foo.gz | grep –label=foo -H something |
|
|
-n --line-number | 显示匹配行的行号 |
|
|
-T --initial-tab | tab对齐 |
|
|
-u --unix-byte-offsets |
|
|
|
-Z --null | 文件名后面的一个字符使用一个0字节代替(ASCIINUL字符) |
2.1.5上下文控制
-A num --after-context=num | 打印匹配行后的num行(num不包含匹配行) |
|
|
-B num --before-context=num | 打印匹配行前的num行(num不包含匹配行) |
|
|
-Cnum -num --context=num | 打印匹配行前后各num行 |
|
|
--group-separator=string | 使用'-A','-B','-C'参数时,使用string代替默认的'--'分割线 |
|
|
--no-group-separator | 不使用分割线 |
2.1.6文件和目录的选择
-a --text | 将二进制文件作为文本文件处理,等效于'—binary-files=text' |
|
|
--binary-files=type | 默认,type为binary,会有二进制文件类型提示,如果未匹配,则无提示。若设定type为without-match,则不匹配二进制文件,等效于参数'-I'。若设定type为text,则会将二进制作为文本处理,等效于参数'-a',此选项会输出不友好的二进制文件内容。 |
|
|
-Daction --devices=action | 如果输入的文件是一个设备,文件流,或socket,则可设定此选项,决定如何处理。若action设定为skip,则会跳过不处理。默认情况下,会读取命令行下设备,若启用'-R'或'-r'选项,则会跳过处理。该参数对标准输入的文件无效。 |
|
|
-daction --directories=action | 如果指定的是目录,则可设定action,决定如何处理它。默认action为read,则将目录作为常规文件处理(有些操作系统或文件系统不允许这样做,会导致grep打印每个目录的错误信息,或跳过处理目录)。若action设定为skip,则会跳过目录。若action设为recurse,grep会进行递规处理,等效于'-r'选项。 |
|
|
--exclude=glob | 跳过匹配glob的文件名,glob可以是'*','?','['...']',可使用\引用通配符或反斜线字符。 |
|
|
--exclude-from=file | 可通过文件指定多个glob(类似于指定多个 --exclude=glob) |
|
|
--exclude-dir=dir | 递规处理时,可排除匹配规则的目录 |
|
|
-I | 设定二进制文件无匹配项,等效于'—binary-files=without-match' |
|
|
--include=glob | 只处理匹配规则的文件,与--exclude相反, |
|
|
-r --recursive | 对目录进行递规处理,等效于'—directories=recurse',会跟随命令行下的符号链接,不会跟随递规过程中的符号链接。 |
|
|
-R --dereference-recursive | 递规处理,跟随递规过程中的符号链接。 |
2.1.7其他选项
--line-buffered | 输出行缓冲内容,会引起性能问题 |
|
|
--mmap | 此选贤已放弃使用。 |
|
|
-U --binary | 处理二进制方式处理文件。默认,在MS-DOS和Windows平台下,grep会根据'—binary-files'选项来判定是文本,还是二进制。如果grep认为文件是文本,则会去掉文件原始内容中的CR字符(以确保^和$正常工作)。 如果文本文件行以CR/LF结尾,会导致正则表达式匹配失败。此选项仅对MS-DOS和Windows生效。 |
|
|
-z --null-data | 将输入内容作为行的合集,每个集合以空字节作为结束(ASCIINUL字符) |
2.2环境变量
2.3退出状态
2.4grep议程
grep使用给定的匹配规则,查询输入文件中的匹配行。默认,grep会打印匹配行。如果输入文件为'-',这代表使用标准输入作为输入文件内容。如果未指定输入,且命令参数中有递归选项,那么grep会搜索工作目录'.';否则,grep会搜索标准输入。grep有四种变种,由下面参数控制:
-G --basic-regexp | 默认选项,匹配规则为常规正则表达式(BRE) |
|
|
-E --extended-regexp | 匹配规则为扩展正则表达式(ERE) |
|
|
-F --fixed-strings | 将匹配规则视为分行的字符串列表 |
|
|
-P --perl-regexp | 将匹配规则,视为perl正则表达式。这是一个测试功能,对未实现的功能,会给出预警提示。 |
另外,还有两个程序可用,分别是egrep和fgrep。egrep等效于'grep-E'。fgrep等效于'grep-F'。
3.正则表达式
正则表达式是描述字符的规则。正则表达式的构造类似于算数表达式,使用各种运算符,将短的表达式结合在一起。grep可读懂三种正则表达式语法:基本正则表达式(BRE),扩展正则表达式(ERE),perl正则表达式。GNU版本的grep,基本正则表达式与扩展正则表达式,在功能上没什么不同。在其他的地方,基本正则表达式则不像扩展正则表达式那样强劲。接下来描述的是扩展正则表达式,与基本正则表达式的不同之处,会在后面进行说明。perl正则表达式提供了许多额外的功能,请参阅pcresyntax手册文档,这种表达式可能并不适用于每种系统。
3.1基本结构
正则结构块,由匹配单个字符的表达式组成。正则匹配的大多数字符,包括字母,数字。任何拥有特殊意义的原字符,如果想要引用它,在其前面放置一个反斜线进行转义。
. | 匹配任意单个字符 |
? | 最多出现一次 |
* | 0次以上 |
+ | 1次以上 |
{n} | n次 |
{n,} | n次或n次以上 |
{,m} | 最多出现m次 |
{n,m} | 最少n次,最多m次 |
空的正则表达式,匹配空字符。两个正则表达式可以拼接在一起,结果由匹配各正则表达的结果拼接而成。两个正则表达式间使用'|'操作符。
重复的优先级高于串联操作,反过来又优先于交替。一整个表达式可以用括号括起来,以覆盖这些优先级规则,并形成子表达式。
3.2字符集和括号表达式
为了获得传统的括号表达式,需设定LC_ALL为C.
[:alnum:] | [:alpha:]与[:digit:]的合集,等同于[0-9A-Za-z] |
[:alpha:] | [:lower:]与[:upper:]的合集,等同于[A-Za-z] |
[:blank:] | 空白字符:空格键和tab键 |
[:cntrl:] | 控制字符,字符对应的十进制数000到037,还有177(del) |
[:digit:] | 01 2 3 4 5 6 7 8 9 |
[:graph:] | 可视字符,[:alnum:]与[:punct:]的合集 |
[:lower:] | 小写字母 |
[:print:] | 可打印字符:[:alnum:],[:punct:],space |
[:punct:] | !" # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ \ ] ^_ ‘ { | } ~ |
[:space:] | 空白符 |
[:upper:] | 大小写字母 |
[:xdigit:] | 十六进制数字:0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f |
] | 括号表达式结束符,如果你想在列表中使用']'字符,请将其放在第一位。 |
[. | 打开排序符号 |
.] | 关闭排序符号 |
[= | 打开等价类 |
=] | 关闭等价类 |
[: | 开启字符类符号 |
:] | 关闭字符类符号 |
- | 如果该字符不在起始或结尾,那么表示范围 |
^ | 表示字符不在列表中,如果你想使用这个字符,请勿将其放置在第一位。 |
3.3反斜线字符和特殊表达式
\b | 匹配单词边缘空字符 |
\B | 匹配非单词边缘的空字符 |
\< |
|
\> |
|
\w |
|
\W |
|
\s |
|
\S |
|
3.4锚位
^与$用于匹配字符起始和结束位的空字符。
3.5反向引用和子表达式
反向引用`\n`(n表示一个数字),可指定第n个子表达式匹配的内容。例如:(a)\1会匹配'aa'。交替使用时,如果组并未参与匹配,那么反向引用会导致整个匹配失败。例如:'a(.)|b\1'不会匹配'ba'。使用'-e'可指定多个表达式,或者使用'-ffile'从文件指定。
3.6基本正则与扩展正则对比
在基本正则表达式中,元字符'?','+','{' ,'|', '(',')'失去其原意,通常需要加上反斜线'\?','\+','\{' ,'\|', '\(','\)'.
传统的egrep不支持原字符'{',一些egrep使用'\{'代替。可移植脚本应该避免在'grep-E'模式中使用'{',推荐使用'[{]'匹配'{'.
4.用法
只列出匹配文件名 | grep-l 'main' *.c |
递归目录搜索 | grep-r 'main' /home/gnu find/home/gnu -name '*.c' -print0 | xargs -0r grep -H 'main' grep-rH –include='*.c' /home/gnu |
搜索'-'起始的选项 | grep-e '--cut here--' 如果不指定'-e',那么'-'会被解析为参数 |
查询整个词(非某词的一部分) | grep-w 'main' * grep'\<main' * grep'main\>' * |
输出匹配周边的内容 | grep-C 2 'main' * |
强制打印匹配文件名 | grep'root' /etc/passwd /dev/null grep-H 'root' /etc/passwd |
为何使用grep匹配ps输出 | 有些平台,ps屏幕输出时,会受屏幕宽度的限制。grep对行长度无限制,除非受限于内存。 |
为何grep会报告“二进制文件匹配” | 可使用'-I'或'—binary-files=without-match' |
为何不使用'grep-lv'打印不包含匹配项的文件名 | 'grep-lv'输出的是包含不匹配项的文件。使用'-L'输出不包含匹配项的文件名 |
使用'|'可完成'OR'操作,那么如何完成'AND'操作呢 | grep'0' /etc/passwd | grep 'root' |
为何空的规则会匹配输入文件每一行 | 不仅限于'^','$','.*',很多规则都会导致匹配每行内容。 想要匹配空行,使用规则'^$'。 匹配空白行,可使用规则'^[[:blank:]]*$' |
如何同时搜索标准输入和文件 | cat/etc/passwd | grep 'root' - /etc/motd |
匹配回文结构 | grep-w -e '\(.\)\(.\).\2\1' file grep-E -e ’^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1$’file |
为何反向引用会失败 | echo'ba' | grep -E '(a)\1|b\1' (a)\1未匹配到内容,例如:'aa',故第二处的'\1'无引用对象 |
如何跨行匹配 | 标准的grep是无法做到的,如果grep启用了perl的匹配功能,可使用perl的's'开关,它使得'.'可以匹配换行。 printf 'foo\nbar\n' | grep -P '(?s)foo.*bar' printf'foo\nbar\n' | grep -z -q 'foo[[:space:]]\+bar' 如果这些选项都失败了,那么你需要处理一下,然后再发给grep。awk,sed,perl或其他很多工具可处理跨行操作。 |
grep,fgrep,egrep代表什么意思 | global/regularexpression/print g/re/p Fixedgrep Extendedgrep |