ZetCode

Linux grep 命令

最后修改于 2025 年 2 月 25 日

Linux 中的 grep 命令是一个强大的工具,用于在文件或输入流中搜索文本。它支持正则表达式,可用于过滤、计数和提取特定文本行。本教程通过实际示例,涵盖了 grep 的基本和高级用法。

grep 常用于搜索日志文件、过滤命令输出以及在脚本中处理文本数据。

基本文本搜索

这会在日志文件中查找错误消息。

basic_search.sh
grep "ERROR" /var/log/syslog

grep 命令在 /var/log/syslog 中搜索包含 "ERROR" 的行并打印它们。区分大小写,只有精确匹配的行才会显示。请先使用 cat /var/log/syslog 验证文件内容。如果没有匹配项,则不显示任何输出。这是快速查找日志中问题的简单方法。

不区分大小写的搜索

这会不区分大小写地搜索用户。

case_insensitive.sh
grep -i "john" users.txt

-i 选项使 grep 忽略大小写,在 users.txt 中匹配 "john"、"John" 或 "JOHN"。这对于大小写不一致的姓名或术语非常有用。如果没有 -i,则只匹配精确的字符串。使用 ls users.txt 检查文件是否存在。输出显示所有大小写变体,减少搜索中的遗漏。

在多个文件中搜索

这会在多个日志中查找关键字。

multiple_files.sh
grep "timeout" app1.log app2.log

grep 命令在 app1.logapp2.log 中搜索 "timeout",并在匹配项前加上文件名(例如 "app1.log:timeout occurred")。这对于比较日志非常方便。请先使用 ls *.log 列出目标文件。如果文件丢失,grep 会发出警告但继续执行。添加 -l 只显示包含匹配项的文件名。

递归搜索

这会在项目目录中查找术语。

recursive_search.sh
grep -r "function" /home/user/code

-r 选项会递归搜索 /home/user/code 下的所有文件以查找 "function",并显示文件路径(例如 "/home/user/code/main.c:function")。这对于代码库非常有用。使用 -R 可以跟随符号链接。运行 find /home/user/code -type f 来预览文件。添加 --include=*.c 可以限制搜索特定扩展名的文件。

计数匹配行

这会计算日志中的登录尝试次数。

count_lines.sh
grep -c "login" auth.log

-c 选项会计算 auth.log 中包含 "login" 的行数,并输出一个数字(例如 "42")。它不会显示匹配的行,只显示计数。这对于快速统计非常有用。可以使用 wc -l auth.log 来验证总行数。如果没有匹配项,则返回 "0"。与 -i 结合使用可以进行不区分大小写的计数。

反向匹配

这会从日志中过滤掉调试行。

invert_match.sh
grep -v "DEBUG" app.log

-v 选项会在 app.log 中显示不包含 "DEBUG" 的行,实现反向匹配。这非常适合排除调试消息等干扰。使用 cat app.log 查看原始内容。多个 -v 标志(例如 -v "DEBUG" -v "INFO")可以排除更多模式。输出是所有不匹配的行,并保持原始顺序。

高级:使用正则表达式

这会在网络日志中查找 IP 地址。

regex_search.sh
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" net.log

-E 选项启用扩展正则表达式,匹配 net.log 中的 IP 地址(例如 "192.168.1.1")。模式 [0-9]{1,3} 表示 1 到 3 位数字,重复四次并用点分隔。如果没有 -E,则需要使用 \. 来匹配点。使用 echo "192.168.1.1" | grep -E 进行测试。添加 -o 只显示匹配的 IP 地址,而不是整行。

示例:显示行号

这会定位带行号的错误。

line_numbers.sh
grep -n "ERROR" error.log

-n 选项会在 error.log 中的匹配项前加上行号(例如 "15:ERROR: crash")。这有助于精确定位文件中的问题。使用 cat -n error.log 进行交叉检查。可以与其他标志(如 -i-r)一起使用。如果没有匹配项,则不显示输出。这对于调试或引用日志中的特定行非常有用。

示例:高亮匹配项

这会高亮显示输出中的搜索词。

highlight_matches.sh
grep --color "fail" test.log

--color 选项会在终端中以颜色(通常是红色)高亮显示 test.log 中的 "fail"。这增强了可读性。在 ~/.bashrc 中设置 GREP_OPTIONS="--color=auto" 可以实现默认行为。可以与管道一起使用(例如 ls | grep --color dir)。在分页时使用 less -R 可以保留颜色。除非重定向,否则在脚本中无效。

示例:带上下文搜索

这会显示匹配项周围的行。

context_search.sh
grep -A 2 -B 1 "crash" crash.log

-A 2(after)和 -B 1(before)选项会分别显示 crash.log 中每个 "crash" 之后的 2 行和之前的 1 行。分隔符(--)用于分隔多个匹配项。使用 -C 3 表示同时显示前后各 3 行。这对于需要上下文的日志分析非常理想。使用 cat crash.log 进行验证。显示更多行可以提供更多事件的洞察。

grep 的最佳实践

来源

GNU grep 手册

在本文中,我们通过各种示例探讨了使用 grep 命令进行文本搜索,包括不区分大小写的搜索、递归搜索、计数匹配项以及使用正则表达式。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了超过 1400 篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Linux 教程