首页>教程>Linux 命令手册> 文件内容查看与处理 >Linux grep 命令 - 支持正则表达式的文本搜索工具

Linux grep 命令 - 支持正则表达式的文本搜索工具

grep 命令(英文全称为 Global Regular Expression Print)是 Linux / Unix 系统中的一款支持正则表达式的文本搜索工具,可以在文件、标准输入中高效的检索符合指定模式的内容,可以用于日志排查、代码检索、文本过滤等使用情况。

grep 命令语法

grep 命令提供了三种语法结构形式,具体的形式为:

  1. grep [ 选项 ]... 匹配模式 [ 文件 ]...
  2. grep [ 选项 ]... -e 匹配模式 ... [ 文件 ]...
  3. grep [ 选项 ]... -f 模式文件 ... [ 文件 ]...

语法中各部分的说明

  • [ 选项 ]:可选的内容,控制匹配规则、搜索范围等内容,可以同时指定多个参数
  • 匹配模式:要搜索的字符串或使用的正则表达式,如果是在 shell 中使用建议用引号包裹,避免解析错误
  • -e 匹配模式:指定匹配模式,可以多次使用该选项,同时搜索多个模式,支持匹配以 - 开头的模式
  • -f 模式文件:从指定的 模式文件 中读取模式,每行为一个模式
  • [ 文件 ]:指定要搜索的目标文件,可以同时指定多个,当指定 - 时从标准输入读取内容;未指定文件时,递归的搜索当前的目录

可替代的命令

在很多的 Linux 发行版中 egrepfgreprgrep 命令已经停止了更新,也很可能是对 grep 命令的链接,如下给出其替代形式:

egrep: 使用 grep -E 替代,其功能是: 支持扩展的正则表达式 fgrep: 使用 grep -F 替代,其功能是: 使用字符串进行匹配,不解析正则表达式 rgrep: 使用 grep -r 替代,其功能是: 递归的搜索目录,不追踪符号链接指定的文件

grep 命令示例

如下给出一些 grep 命令的使用示例,基本上能涵盖 grep 命令的常用的使用情况。

基础字符串匹配

不使用任何的选项,会进行基本的搜索:

grep "root" /etc/passwd

会输出包含指定字符串的行。

匹配时忽略大小写

使用 -i 选项忽略搜索的字符之间的大小写:

grep -i "error" log.txt

排除指定的内容

使用 -v 选项搜索不包含指定内容的行:

grep -v "#" /etc/profile

该示例搜索不包含 # 字符的行。

显示行号

使用 -n 选项显示内容所在的行号:

grep -n "Listen" /etc/apache2/ports.conf

全词匹配

使用 -w 选项匹配时需要匹配完整的单词:

grep -w "user" test.txt

递归搜索目录

使用 -r 选项递归遍历目录下所有文件:

grep -r "name" ./

输出的内容会显示:文件名 + 行内容

[!NOTE]

等同于使用 rgrep "name" ./,但是推荐使用该示例中的 grep -r "name" ./ 命令

使用扩展的正则表达式匹配

指定 -E 选项使用扩展的正则表达式进行匹配字符串:

grep -E "error|warning" app.log

该示例使用 | 来匹配多个内容。会匹配包含 errorwarning 的行。

grep 命令选项

grep 命令很多的选项,因此可以支持非常多的功能,为了便于了解 grep 命令的所有可用的功能,如下给出 grep 命令的所有选项的详细解释说明:

选项功能详细说明
--help显示帮助信息并退出
--version显示版本信息并退出
-E, --extended-regexp使用扩展的正则表达式(ERE)
-F, --fixed-strings使用固定字符串进行匹配,不使用正则表达式
-G --basic-regexp使用基本的正则表达式进行内容匹配,属于默认行为
-P, --perl-regexp使用 Perl 兼容的正则表达式,该选项十一个实验性的特性
-e PATTERNS, --regexp=PATTERNS指定匹配模式 PATTERNS,可以重复使用该选项,来指定多个模式,支持匹配以 - 开头的模式
-f FILE, --file=FILE从指定文件 FILE 读取模式,每行为一个模式,如果指定为 - 从标准输入读取模式
-i, --ignore-case匹配时忽略内容的大小写差异
--no-ignore-case匹配时不忽略内容的大小写差异,会覆盖掉 -i 选项
-v, --invert-match显示不包含指定模式的行
-w, --word-regexp只匹配完整的单词,单词有字母、数字、下划线组成
-x, --line-regexp匹配完整的行
-c, --count只统计每个文件的匹配的行数
--color[=WHEN]高亮显示匹配的内容,WHEN 可选的值有: never / always / auto
-L, --files-without-match只输出未匹配到内容的文件名
-l, --files-with-matches只输出匹配到内容的文件名,当在文件中匹配到内容时即停止在该文件中继续匹配
-m NUM, --max-count=NUM匹配到 NUM 行后停止匹配内容
-o, --only-matching只输出匹配的非空部分
-q, --quiet, --silent不输出任何的内容,匹配成功立就退出
-s, --no-messages不输出错误提示
-b, --byte-offset在行的前部输出匹配行在文件中的字节偏移量,从 0 开始,如果制定了 -o / --only-matching 输出匹配内容的偏移量
-H, --with-filename在每个匹配行的前面添加文件名,当使用多文件搜索时默认启用该选项
-h, --no-filename不在匹配行的前面添加文件名,当在单文件中搜索默认启用该选项
--label=LABEL将从标准输入读取的内容显示为从 LABEL 文件读取的内容
-n, --line-number在匹配行的前面添加行号,从 1 开始
-T, --initial-tab使用制表符对齐输出的内容
-Z, --null文件名后输出一个 ASCII 空字符 NUL,替代默认使用的字符
-A NUM, --after-context=NUM在匹配行的后面会输出 NUM 行的内容
-B NUM, --before-context=NUM在匹配行的前面显示 NUM 行的内容
-C NUM, --context=NUM, -NUM在匹配行的前后各显示 NUM 行的内容
--group-separator=SEP当使用 -A, -B, -C 选项时,使用 SEP 分隔符来分隔分组内容,替代默认的 -- 分隔符
--no-group-separator当使用 -A, -B, -C 选项时,分组内容之间不使用分隔符
-a, --text将二进制文件当作文本文件来处理,与 --binary-files=text 的功能相同
--binary-files=TYPE把二进制文件按照指定的 TYPE 的文件来处理,TYPE 可选的值有: binary (当作二进制文件) / without-match (不进行匹配) / text (当作文本文件)
-D ACTION, --devices=ACTION指定设备文件的处理方式,ACTION 可选的值有: read / skip
-d ACTION, --directories=ACTION指定目录的处理方式,ACTION 可选的值有: read (像读取普通文件一样读取目录,该值是默认值) / skip (跳过) / recurse (递归的读取目录中的文件的内容)
--exclude=GLOB跳过匹配通配符 GLOB 的文件
--exclude-from=FILE跳过文件名与 FILE 文件中指定的规则匹配的文件
--exclude-dir=GLOB递归搜索时跳过与 GLOB 匹配的目录
-I忽略二进制文件的内容,与 --binary-files=without-match 选项的功能相同
--include=GLOB只在文件名匹配 GLOB 的文件中进行查找
-r, --recursive递归的搜索目录中的文件,只跟随在命令行中指定的软链接
-R, --dereference-recursive递归的搜索目录中的文件,跟随所有的软链接
--line-buffered在输出时,开启行缓冲,这样可能会降低性能
-U, --binaryWindows 平台专用,不处理 CR 字符,直接读取文件的内容
-z, --null-data以 ASCII 空字符 NUL 作为行分隔符,替代默认的换行符

结语

grep 命令是 Linux / Unix 系统中一款基础的搜索工具,它支持正则表达式匹配且提供丰富的选项,可以进行不同的搜索操作,grep 命令是一个综合性的搜索工具,它是对 egrepfgreprgrep 命令的整合,也是更现代的替代工具。