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