Fork Me
用户手册之grep
25 Dec 2014 - by @ssdr

名字

grep, egrep, fgrep - 打印匹配模式的行

用法

grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

选项

匹配控制

-e PATTERN, --regexp=PATTERN 使用PATTERN作为匹配模式
-f FILE, --file=FILE 从文件获取模式,每行一个
-i 忽略大小写
-v 反向匹配
-w, --word-regexp 选择匹配整个单词的行
-x, --line-regexp 选择完全匹配整行的行

输出控制

-c, --count 输出匹配行数目
--color[=WHEN], --colour[=WHEN] 颜色显示匹配项,WHEN取值[never, always, auto]
-L, --files-without-match 打印没有匹配的文件名
-l, --files-with-matches 打印有匹配的文件名
-m NUM, --max-count=NUM 达到最大匹配数时停止读取文件
-o, --only-matching 仅输出匹配行的匹配部分
-q, --quiet, --silent 无任何输出,找到匹配立刻返回0,即使是发生错误

输出行前缀控制

-b, --byte-offset 打印匹配部分的偏移量
-H, --with-filename 打印匹配行的文件名,多文件时的默认行为
-h, --no-filename 不打印匹配行的文件名,单文件时的默认行为
-n, --line-number 打印行号

上下文行控制

-A NUM, --after-context=NUM 打印匹配后的NUM行
-B NUM, --before-context=NUM 打印匹配前的NUM行
-C NUM, -NUM, --context=NUM 打印NUM行上下文

正则表达式

正则表达式表述了一个字符串集合的模式,正则表达式的构成类似于数学表达式,都使用操作符组成的短小表达式。

字符和括号表达式

括号表达式是由[和]括起来的一组字符。它表示括号里的某个字符;如果该组字符以开头,表示任何不在该列表中的字符。例如,正则表达式[0123456789]表示任何个位数字。
括号表达式里可以书写range表达式,range表达式由两个字符以及分隔符-组成。例如,[a-d]等同于[abcd]。
一些预定义的字符类:

[:alnum:]
[:alpha:]
[:cntrl:]
[:digit:]
[:graph:]
[:lower:]
[:print:]
[:punct:]
[:space:]
[:upper:]
[:xdigit:]

和$分别表示空字符串的开头和结尾

反斜杠和特殊表达式

\<和\>分别表示空字符串的word开始和结束。
\b word边界
\B 非word边界
\w 同[[:alnum:]]
\W 同[^[:alnum:]]

重复

? 0次或1次
* 大于等于0次
+ 大于等于1次
{n} n次
{n,} 大于等于n次
{,m} 小于等于m次
{n,m} 大于等于n次,且小于等于m次

基本和扩展正则表达式

在基本正则表达式中,一些元字符如?, +, {, |, (等失去特殊含义,要使用需要前面加\如\?, +, {, |, (。
egrep不支持{元字符,而一些egrep的实现支持{,所以在grep -E中可移植脚本应该避免{,应该使用[{]来匹配{。