Linux grep 命令 - 支持正则表达式的文本搜索工具
grep 命令(英文全称为 Global Regular Expression Print)是 Linux / Unix 系统中的一款支持正则表达式的文本搜索工具,可以在文件、标准输入中高效的检索符合指定模式的内容,可以用于日志排查、代码检索、文本过滤等使用情况。
grep 命令语法
grep 命令提供了三种语法结构形式,具体的形式为:
grep [ 选项 ]... 匹配模式 [ 文件 ]...grep [ 选项 ]... -e 匹配模式 ... [ 文件 ]...grep [ 选项 ]... -f 模式文件 ... [ 文件 ]...
语法中各部分的说明
[ 选项 ]:可选的内容,控制匹配规则、搜索范围等内容,可以同时指定多个参数匹配模式:要搜索的字符串或使用的正则表达式,如果是在 shell 中使用建议用引号包裹,避免解析错误-e 匹配模式:指定匹配模式,可以多次使用该选项,同时搜索多个模式,支持匹配以-开头的模式-f 模式文件:从指定的模式文件中读取模式,每行为一个模式[ 文件 ]:指定要搜索的目标文件,可以同时指定多个,当指定-时从标准输入读取内容;未指定文件时,递归的搜索当前的目录
可替代的命令
在很多的 Linux 发行版中 egrep、fgrep、rgrep 命令已经停止了更新,也很可能是对 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
该示例使用 | 来匹配多个内容。会匹配包含 error 或 warning 的行。
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, --binary | Windows 平台专用,不处理 CR 字符,直接读取文件的内容 |
-z, --null-data | 以 ASCII 空字符 NUL 作为行分隔符,替代默认的换行符 |
结语
grep 命令是 Linux / Unix 系统中一款基础的搜索工具,它支持正则表达式匹配且提供丰富的选项,可以进行不同的搜索操作,grep 命令是一个综合性的搜索工具,它是对 egrep、fgrep、rgrep 命令的整合,也是更现代的替代工具。