1.本文为info man的译文,基本按照原文翻译,有几个用不上的选项没有翻译,但为了文章的完整性,给出了原文。
2.译文中有些"(注:)",为本人自行加入,帮助理解和说明,非原文内容!
本文目录:
1 简介
2 调用grep程序
2.1 命令行选项
2.1.1 一般选项
2.1.2 控制匹配模式
2.1.3 控制输出内容
2.1.4 控制输出行的前缀
2.1.5 控制输出行的上下文
2.1.6 筛选文件和目录
2.1.7 其他选项
2.2 退出状态码
2.3 各种grep程序
3 正则表达式
3.1 基本结构
3.2 字符类和中括号表达式
3.3 反斜线字符和特殊的表达式
3.4 锚定
3.5 后向引用和子表达式
3.6 基础正则和扩展正则的比较
4 使用示例
5 已知的一些Bug
'grep'用于搜索给定文件中能匹配给定pattern列表的行。当某行能匹配上,(默认)将拷贝该行到标准输出,或者根据你所指定的选项生成其它序列的输出。
尽管'grep'所期望的是在文本行中做匹配,但即使某输入行的大小长度超出了可用内存空间也不会受到限制,它仍可以匹配一行中任意字符串。如果输入文件的最后一个字节不是换行符,'grep'会自动补上一个。由于换行符也是pattern列表的分隔符,因此没有任何办法匹配文本中的换行符。
2 Invoking 'grep''grep'命令行的一般语法格式为:
grep OPTIONS PATTERN INPUT_FILE_NAMESOPTIONS部分可以指定0或多个。只有当没有使用"-e PATTERN"或"-f FILE"时,指定的PATTERN才被grep可视。可以指定0或多个INPUT_FILE_NAMES。
2.1 Command-line Options(命令行选项)'grep'有大量选项可用:一些是POSIX.2中的,一些是GNU扩展的。长选项都是GNU扩展选项,即使它们来自于POSIX。由POSIX指定的短选项,被明确标注为便于POSIX可移植性编程。有少数几个选项是为了兼容古老版本的grep。 有几个额外的选项用于控制使用哪种变体'grep'匹配引擎(注:fgrep/grep/egrep)。
2.1.1 Generic Program Information'--help'
输出简短的grep命令行使用帮助并退出。
'-V'
'--version'
输出'grep'的版本号。
'-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.'能匹配该行)
'-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会在最后一次匹配行后做位置标记,使得调用的另一个进程可以从此处恢复并继续向下搜索。例如,下面的shell脚本:
而下面的shell脚本则以不同于上面脚本方式运行,因为此处使用的是管道,这不是一个实体文件:
cat FILE | while grep -m 1 PATTERN do echo xxxx done(注:如果对这两个脚本有疑问,可参考while循环中的陷阱,该文章中解释了管道和文件直接重定向时的区别)
'-o'
'--only-matching'
输出被匹配到的字符串,而不是输出整行。每个被匹配到的字符串都使用单独的行输出。