详解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:]'
grep命令有什么用打印字符类。包括:⼤⼩写字母、数字、标点符号和空格。等价于字符类'[: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'是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程序。
使⽤扩展正则表达式引擎解析PATTERN,因此⽀持扩展正则表达式(ERE)。('-E'是POSIX指定的选项。)
'-F'
'--fixed-strings'
不识别正则表达式,⽽是使⽤字符的字⾯意义解析PATTERN,因此只⽀持固定字符串的精确匹配。('-F'是POSIX指定的选项。) '-P'
'--perl-regexp'
使⽤perl正则表达式引擎解析PATTERN,因此⽀持Perl正则表达式。但该程序正处于研究测试阶段,因此会给出⼀个警告。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论