详解grep命令


1、grep命令行的一般语法格式为:

grep 【OPTIONS】 PATTERN INPUT_FILE_NAMES

  grep是一种匹配尽可能多的一种匹配模式,“贪婪模式”

  PATTERN部分表示正则表达式

正则表达式又由普通字符和元字符组成,元字符的依据分类也可以分为:

次数限制元字符:

*表示任意多次;

?表示一次或者零次

+表示大于或者等于一次

{}表示指定范围次数,{n,m}{n,}{,m}{n,n}

位置锚定元字符:

^表示必定以其后面所跟字符开头

$表示必定一起前面所跟字符结尾

\<\>表示单词边界字符

字符类和中括号表达式

中括号正则表达式是使用"["和"]"包围的字符列表。它能匹配该列表中的任意单个字符。如果列表中的第一个字符是"^",则表示不匹配该列表中的任意单个字符。例如,'[0123456789]'能匹配任意数字。

中括号中可以使用连字符"-"连接两个字符表示"范围"。例如,C字符集下的"[a-d]"等价于"[abcd]"。大多数字符集规则和字典排序规则一样,这意味着"[a-d]"不等价于"[abcd]",而是等价于"[aBbCcDd]"。可以设置环境变量"LC_ALL"的值为C使得采取C字符集的排序规则。

最后,预定义了几个特定名称的字符类,它们都使用中括号包围。如下:

'[:alnum:]'
匹配大小写字母和数字。等价于字符类'[:alpha:]'与字符类'[:digit:]'的和。

'[:alpha:]'
字母字符类。匹配大小写字母。等价于字符类'[:lower:]'和字符类'[:upper:]'的和。

'[:blank:]'
空白字符类。包括:空格和制表符。

'[:cntrl:]'
控制字符类。在ASCII中,这些字符的八进制代码从000到037,还包括177(DEL)。

'[:digit:]'
数字字符类。包括:'0 1 2 3 4 5 6 7 8 9'。

'[:graph:]'
绘图类。包括:大小写字母、数字和标点符号。等价于

'[:lower:]'
小写字母类。包括:'a b c d e f g h i j k l m n o p q r s t u v w x y z'。

'[:print:]'
打印字符类。包括:大小写字母、数字、标点符号和空格。等价于字符类'[:alnum:]'与字符类'[:punct:]'和空格的和。

'[:punct:]'
标点符号类。包括:'! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~'。

'[:space:]'
空格字符类。包括:空格、制表符、垂直制表符、换行符、回车符和分页符。

'[:upper:]'
大写字母类。包括:'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'。

'[:xdigit:]'
十六进制类。包括:'0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f'。

例如,"[[:alnum:]]"表示"[0-9A-Za-z]","[^[:digit:]]"表示[^0123456789],"[ABC[:digit:]]"表示"[ABC0-9]"。注意,字符类必须包含在额外的中括号内。

中括号中的大多数元字符都丢失了它们特殊意义,而成为普通的字面符号。

']'
该符号表示中括号的结束。如果要匹配该字面字符,则必须将其放在字符列表的最前面。即"[]...]"。

'[.'
该符号表示排序符号的开始。
(注:排序类需要在字符集中预先定义好才能使用。例如[.ab.]表示将“ab”作为整体匹配,不匹配a或b。但默认情况下,字符集里肯定是没有定义好"ab"这个排序整体的,所以无法使用)

'.]'
表示排序符号的结束。

'[='
表示等价类的开始。
(注:例如,[=e=]表示将字母e的第一声和第三声等不同音节的同字母看成相同字符。)

'=]'
表示等价类的结束。

'[:'
表示字符类的开始。

':]'
表示字符类的结束。

'-'
该字符是范围连接符,因此要匹配该符号的字面意义,需要将其放在列表的最前面或最后面或作为范围的结束字符。

'^'
该字符表示不在列表中的字符。如果想匹配该字符的字面意义,则必须不能放在列表的第一个字符。

字符分组和引用:

()

其他元字符:

.

代表任意字符

'\w'
匹配单词成分的字符。是[_[:alnum:]]的同义词。

'\W'
匹配非单词成分的字符,是[^_[:alnum:]]的同义词。

'\s'
匹配空白字符,是[[:space:]]的同义词。

'\S'
匹配非空白字符,是[^[:space:]]的同义词。

2、OPTION

2.1.2 控制匹配模式

'-e PATTERN'
'--regexp=PATTERN'
明确指定使用此处的PATTERN作为待匹配的pattern。该选项可以指定多次,它可以保护以"-"开头的pattern。('-e'是POSIX指定的选项。)

'-f FILE'
'--file=FILE'
从FILE中获取pattern列表,每行一个pattern。空的FILE表示不给定任何pattern,所以不会匹配到任何内容。('-f'是POSIX指定的选项。)

'-i'
'-y'
'--ignore-case'
忽略PATTERN中的大小写,也忽略输入文件中的大小写区别。'-y'是废弃的用于和老版本保持兼容性的选项。('-i'是POSIX指定的选项。)

'-v'
'--invert-match'
反转匹配的结果,即选择那些未匹配到的行。('-v'是POSIX指定的选项。)

'-w'
'--word-regexp'
仅选择能精确匹配整个单词的行。单词的组成字符包括:字母、数字和下划线。除了这些字符,其余都是该选项筛选单词时的单词边界分隔符。 (注:例如字符串"fstab fstab(5)",grep -w 'fstab'或grep -w 'fsta.'能匹配这两个单词,但grep -w 'fsta'无法匹配任意一个)

'-x'
'--line-regexp'
仅选择能精确匹配整行内容的行。('-x'是POSIX指定的选项。)
(注:例如某行"abcde",grep -x 'abc'将无法匹配该行,而grep -x 'abcd.'能匹配该行)

2.1.3 控制输出内容

'-c'
'--count'
不再输出匹配的内容,而是输出匹配到的行数量。如果给定了"-v"选项,则输出未匹配到的行数量。('-c'是POSIX指定的选项。)

'--color[=WHEN]'
'--colour[=WHEN]'
对匹配到的内容赋予颜色并输出。WHEN的有效值包括:'never'、'always'或'auto'。

'-L'
'--files-without-match'
不再输出匹配的内容,而是输出未能被匹配到的文件名,当某文件中的某行被匹配到,将不再继续向下搜索该文件。
(注:和"-l"输出的文件名相反)

'-l'
'--files-with-matches'
不再输出匹配的内容,而是输出能被匹配到的文件名,当某文件中的某行被匹配到,将不再继续向下搜索该文件。('-l'是POSIX指定的选项。)

'-m NUM'
'--max-count=NUM'
匹配成功的行有NUM行时,停止读取文件。如果是普通文件作为标准输入,则输出这匹配到的NUM行。grep会在最后一次匹配行后做位置标记,使得调用的另一个进程可以从此处恢复并继续向下搜索。

'-o'
'--only-matching'
只输出被匹配到的字符串,而不是输出整行。每个被匹配到的字符串都使用单独的行输出。

'-q'
'--quiet'
'--silent'
静默模式,立即退出,即使遇到了错误。不写任何内容到标准输出。如果匹配到了内容则退出状态码为0。('-q'是POSIX指定的选项。)

'-s'
'--no-messages'
禁止输出因文件不存在或文件没有读权限而产生的错误信息。('-s'是POSIX指定的选项。)

(注:由于POSIX和GNU grep的差异性,在可移植性的脚本中,应尽量避免使用"-q"和"-s",而是使用重定向的方式重定向到/dev/null)

2.1.3 控制输出行的上下文

无论下面的选项如何设置,grep都不会多次输出同一行。如果指定了"-o"选项,这些选项将失效,并给出一个警告。

'-A NUM'
'--after-context=NUM'
除了输出匹配到的行,还输出匹配到内容的后NUM行。

'-B NUM'
'--before-context=NUM'
除了输出匹配到的行,还输出匹配到内容的前NUM行。

'-C NUM'
'-NUM'
'--context=NUM'
除了输出匹配到的行,还输出匹配到内容的前NUM行和后NUM行。

2.3 grep各种版本应用场景

有4种grep程序分别支持不同的搜索引擎,使用下面4个选项可以选择使用哪种grep程序。

'-G'
'--basic-regexp' 使用基础正则表达式引擎解析PATTERN,因此只支持基础正则表达式(BRE)。这是默认grep程序。

'-E'
'--extended-regexp'
使用扩展正则表达式引擎解析PATTERN,因此支持扩展正则表达式(ERE)。('-E'是POSIX指定的选项。)

'-F'
'--fixed-strings'
不识别正则表达式,而是使用字符的字面意义解析PATTERN,因此只支持固定字符串的精确匹配。('-F'是POSIX指定的选项。)

'-P'
'--perl-regexp'
使用perl正则表达式引擎解析PATTERN,因此支持Perl正则表达式。但该程序正处于研究测试阶段,因此会给出一个警告。

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM