LinuxShell命令grep

【注】具体详解参见 man 手册。

1. 简介

grep 命令用来在文件中查找并输出包含匹配指定模式的字符的行。

2. 格式

1
2
3
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] -e PATTERN ... [FILE...]
grep [OPTIONS] -f FILE ... [FILE...]

其中,OPTIONS 为指定的选项参数,PATTERN 为匹配模式(可以为固定字符串、基础正则表达式 BRE 、扩展正则表达式 ERE 以及 Perl 兼容正则表达式 PCRE),FILE 为指定文件输入(FILE- 代表从标准输入读入)。PATTERN 指定为 BREERE 可参照 LinuxShell正则表达式

3. 常用参数

3.1 基础信息

选项参数 说明
--help 帮助手册
-V, --version 版本信息

3.2 选择匹配模式

选项参数 说明
-E, --extended-regexp 使用 ERE 解释 PATTERN
-F, --fixed-strings 把 PATTERN 仅当做固定字符串来解释
-G, --basic-regexp 使用 BRE 解释 PATTERN(默认)
-P, --perl-regexp 使用 PCRE 解释 PATTERN
  • 匹配模式控制
选项参数 说明
-e PATTERN, --regexp=PATTERN 该选项可被使用多次用于指定多个模式
或者用于保护以 - 为首的模式不被解释为参数
-f FILE, --file=FILE 从文件 FILE 中读取匹配模式(每行一个)
-i, --ingore-case 不区分大小写(grep 默认区分)
-v, --invert-match 返向搜索(输出不匹配模式行)
-w, --word-regexp 只输出包含有完整的词匹配的行(词的组成字符是字母、数字、下划线)
匹配的字符串是必须是行首或者一个不是词组成的字符之后,且必须是行尾或者一个不是词组成的字符之前
-x, --line-regexp 只输出完整行匹配的行(与 -w 同时使用则 -w 无效)

3.3 普通行输出控制

选项参数 说明
-c, --count 禁止通常的输出,取而代之输出匹配的行数
-L, --files-without-match 禁止通常的输出,取而代之输出没有任何文本匹配的文件名
(对于输入文件,扫描到第一个匹配的时候就会停止)
-l, --files-with-matches 禁止通常的输出,取而代之输出有任一文本匹配的文件名
(对于输入文件,扫描到第一个匹配的时候就会停止)
-m NUM, --max-count=NUM 输出 NUM 个匹配的行之后停止继续读取
当同时使用 -c, --count 选项时,输出行数不会比 NUM 更多
当同时指定 -v, --invert-match 选项时,输出 NUM 个不匹配的行之后停止继续读取
-o, --only-matching 只输出匹配的字符串部分(每部分输出占一行)
-q, --quiet, --silent 安静模式,不向标准输出写任何信息
如何找到任何匹配字符串就立即以状态 0 退出,即使检测到错误(参见 -s, --no-messages 选项)
-s, --no-messages 禁止输出任何有关文件不存在或不可读的错误信息

3.4 行输出前缀控制

选项参数 说明
-b, --byte-offset 在输出的每行前面同时打印出当前行在输入文件中的字节偏移量
当同时指定 -o, --only-matching 选项时,取而代之打印出匹配部分的字节偏移量
-H, --with-filename 在输出的每行前面同时打印出所属文件(当输入多个文件时默认该选项)
-h, --no-filename 禁止在输出行前加文件名前缀(当输入单个文件或标准输入时默认该选项)
--label=LABEL 讲实际上来自标准输入的输入视为来自文件 LABEL 的输入
-n, --line-number 在输出行前加上其所在文件中的行号
-T, --initial-tab 确保每个输出行在输出前缀信息后的一个 Tab 后对齐输出
当同时含有 -H, -n, -b 选项时,由于前缀的不等长,该选项则显得非常有用
-Z, --null 在文件名输出后紧跟着输出一个全零字节(ASCII NUL 字符),取代原来的文件名后紧随的字符(换行符、: 等)

3.5 文本行控制

选项参数 说明
-A NUM, --after-context=NUM 额外输出紧随匹配行之后最多 NUM
NUM 小于相邻匹配行间的不匹配行数时,则再附加输出 -- 作为相邻分隔符
NUM 大于相邻匹配行间的不匹配行数时,只输出相邻匹配行间的所有行
当同时含有 -o, --only-matching 参数时,该参数除输出 -- 分隔符行外均无效
-B NUM, --before-context=NUM 额外输出紧随匹配行之前最多 NUM
NUM 小于相邻匹配行间的不匹配行数时,则再附加输出 -- 作为相邻分隔符
NUM 大于相邻匹配行间的不匹配行数时,只输出相邻匹配行间的所有行
当同时含有 -o, --only-matching 参数时,该参数除输出 -- 分隔符行外均无效
-C NUM, -NUM, --context=NUM 额外输出紧随匹配行前后各最多 NUM
NUM 小于相邻匹配行间的不匹配行数时,则再附加输出 -- 作为相邻分隔符
NUM 大于相邻匹配行间的不匹配行数时,只输出相邻匹配行间的所有行
当同时含有 -o, --only-matching 参数时,该参数除输出 -- 分隔符行外均无效
  • 举例
1
grep -B 1 "!" file

输出结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
hhhhhhhhhhhhhhhhhhhhh
hello world !
--
1
hello earth !
--
2
hello universe !
--
3
hello universe !
hello earth !
hello world !

其中,file 文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
hhhhhhhhhhhhhhhhhhhhh
hello world !
:)
1
hello earth !
:(
2
hello universe !
:|
3
hello universe !
hello earth !
hello world !

3.6 选择文件(夹)

选项参数 说明
-a, --text 将二进制文件当做文本文件来处理(等价于下文 --binary-files=text
--binary-files=TYPE 如果一个文件的起始几个字节表明文件包含二进制文件,则假定该文件是 TYPE 类型的(默认 TYPEbinary)
如果 TYPEbinary,那么不会输出匹配行,而是匹配成功输出提示信息或匹配失败不输出信息
如果 TYPEwithout-match,那么假定二进制文件不会匹配(等价于 -I 选项)
如果 TYPEtext,那么将一个二进制文件视为文本文件处理(等价于 -a 选项)
-D ACTION, --devices=ACTION 如果输入文件是一个设备(FIFO 或 socket),使用动作 ACTION 处理(默认为 read
ACTION 指定为 read 时,将设备视为普通文件来读取
ACTION 指定为 skip 时,将不处理而直接跳过设备
-d ACTION, --directories=ACTION 如果输入文件是一个目录,使用动作 ACTION 处理(默认为 read
ACTION 指定为 read 时,将设备视为普通文件来读取
ACTION 指定为 skip 时,将不处理而直接跳过该目录
ACTION 指定为 recurse 时,递归读取目录下的所有文件(等价于 -r 选项)
--exclude=GLOB 跳过文件名匹配通配符模式 GLOB 的所有文件
如果是递归读取目录下的文件,则跳过基本名(不包含路径)匹配模式的所有文件
--exclude-from=FILE 通过文件 FILE 指定 GLOB 模式,跳过匹配 FILE 中任一模式的文件
--exclude-dir=GLOB 跳过目录名匹配通配符模式 GLOB 的所有目录
如果是递归读取目录下的目录,则跳过基本名(不包含路径)匹配模式的所有目录
-I 将二进制文件视为不会匹配处理(等价于上文 --binary-files=without-match
--include=GLOB 只处理文件名匹配通配符模式 GLOB 的文件
如果是递归读取目录下的文件,则处理基本名(不包含路径)匹配模式的所有文件
-r, --recursive 递归处理目录下的所有文件,同 -d recurse 选项
对于符号链接,仅在命令行上才按照符号链接所指定的文件/目录递归地读取所有文件。
-R, --dereference-recursive 递归处理目录下所有文件(包括符号链接)

3.7 其他选项

选项参数 说明
--line-buffered 输出时使用行缓存(可能造成性能下降)
-U, --binary 将文件视为二进制文件处理
-z, --null-data 将输入输出数据视为行串处理,每行以一个全零字节符(ASCII NUL)而不是换行符结束(类似 -Z, --null 选项)

4. 退出状态

  • 正常情况下,有任一行匹配返回退出状态 0,没有任何行匹配返回退出状态 1,有错误出现返回退出状态 2 。

  • 当指定 -q, --quiet, --silent 选项时,有错误出现也返回退出状态 0 。