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正则表达式。但该程序正处于研究测试阶段,因此会给出一个警告。