grep 中文手册

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的扩展,这些参数甚至来源于POSIXPOSIX标准的短文件名,是为了方便进行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

默认,typebinary,会有二进制文件类型提示,如果未匹配,则无提示。若设定typewithout-match,则不匹配二进制文件,等效于参数'-I'。若设定typetext,则会将二进制作为文本处理,等效于参数'-a',此选项会输出不友好的二进制文件内容。



-Daction

--devices=action

如果输入的文件是一个设备,文件流,或socket,则可设定此选项,决定如何处理。若action设定为skip,则会跳过不处理。默认情况下,会读取命令行下设备,若启用'-R''-r'选项,则会跳过处理。该参数对标准输入的文件无效。



-daction

--directories=action

如果指定的是目录,则可设定action,决定如何处理它。默认actionread,则将目录作为常规文件处理(有些操作系统或文件系统不允许这样做,会导致grep打印每个目录的错误信息,或跳过处理目录)。若action设定为skip,则会跳过目录。若action设为recursegrep会进行递规处理,等效于'-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-DOSWindows平台下,grep会根据'—binary-files'选项来判定是文本,还是二进制。如果grep认为文件是文本,则会去掉文件原始内容中的CR字符(以确保^$正常工作)

如果文本文件行以CR/LF结尾,会导致正则表达式匹配失败。此选项仅对MS-DOSWindows生效。



-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正则表达式。这是一个测试功能,对未实现的功能,会给出预警提示。


另外,还有两个程序可用,分别是egrepfgrepegrep等效于'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_ALLC.


[:alnum:]

[:alpha:][:digit:]的合集,等同于[0-9A-Za-z]

[:alpha:]

[:lower:][:upper:]的合集,等同于[A-Za-z]

[:blank:]

空白字符:空格键和tab

[:cntrl:]

控制字符,字符对应的十进制数000037,还有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'

如果这些选项都失败了,那么你需要处理一下,然后再发给grepawksedperl或其他很多工具可处理跨行操作。

grep,fgrep,egrep代表什么意思

global/regularexpression/print

g/re/p

Fixedgrep

Extendedgrep




  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值