在 Linux 系统维护与应用故障排查中,日志文件通常记录着程序运行状态、异常信息和错误原因。面对体量较大的日志文件,逐行查看效率较低。grep 命令可以按照关键字筛选日志内容,是定位错误信息的基础工具。
日志错误定位的第一步,是明确要查找什么。grep 用于在文本文件中查找包含指定内容的行,适合从日志中筛选错误级别、异常类型或失败描述。
1. 基本语法
Terminal
# grep 的基本语法
$ grep "关键字" 文件名
匹配到的文本行
2. 查找错误关键字
应用日志中常见的检索关键字包括 ERROR、failed、exception、timeout。例如,在 app.log 中查找错误信息:
Terminal
# 在 app.log 中查找 ERROR
$ grep "ERROR" app.log
2026-07-02 10:15:23 ERROR database connection failed
该命令会输出 app.log 中所有包含 ERROR 的日志行,适用于快速筛选错误记录。
筛选出错误记录后,需要进一步确认错误所在位置,并尽量避免因日志格式差异造成遗漏。行号、大小写忽略和上下文查看,是提高定位精度的三个常用能力。
1. 显示错误所在行号
排查日志时,行号可以帮助定位错误在文件中的具体位置。使用 -n 参数可以显示匹配行号:
Terminal
# 显示匹配内容所在行号
$ grep -n "ERROR" app.log
128:2026-07-02 10:15:23 ERROR database connection failed
其中 128 表示该条错误日志位于文件第 128 行,后续内容为具体日志信息。
2. 忽略大小写匹配
不同程序的日志格式并不完全一致,错误关键字可能显示为 error、Error 或 ERROR。使用 -i 参数可以忽略大小写差异:
Terminal
# 忽略大小写查找 error
$ grep -i "error" app.log
2026-07-02 10:15:23 ERROR database connection failed
该命令会匹配所有大小写形式的 error,避免因关键字大小写不同导致遗漏。
3. 查看错误上下文
错误原因往往不只存在于单行日志中,前后日志也可能包含请求参数、调用链路或异常堆栈。grep 可以通过上下文参数显示相关内容。
Terminal
# 显示匹配行前后各 3 行
$ grep -C 3 "ERROR" app.log
2026-07-02 10:15:20 INFO request received
2026-07-02 10:15:23 ERROR database connection failed
2026-07-02 10:15:24 WARN retry connection
-C 表示同时查看前后内容,-B 表示查看匹配行之前内容,-A 表示查看匹配行之后内容。
实际环境中,日志通常会按日期、模块或大小进行拆分。如果只检索单个文件,可能无法覆盖完整错误记录。此时需要面向多个文件或目录进行检索。
1. 查找多个日志文件
Terminal
# 在当前目录的所有 .log 文件中查找 ERROR
$ grep -n "ERROR" *.log
app.log:128:2026-07-02 10:15:23 ERROR database connection failed
2. 递归查找日志目录
Terminal
# 在目录中递归查找 ERROR
$ grep -r "ERROR" /var/log/myapp/
/var/log/myapp/app.log:128:2026-07-02 10:15:23 ERROR database connection failed
该命令会在 /var/log/myapp/ 目录及其子目录中查找包含 ERROR 的日志行。
当需要判断某类错误出现频率时,可以使用 -c 参数统计匹配行数。该参数不会输出每一条匹配日志,而是返回匹配数量。
Terminal
# 统计 ERROR 出现次数
$ grep -c "ERROR" app.log
37
输出结果表示包含 ERROR 的日志行数量。该方式适用于判断错误规模,也可用于对比不同日志文件中的错误数量。
多个参数可以组合使用,以满足更具体的排查需求。组合命令适合在已知关键字的情况下,同时获得行号、上下文和检索范围。
1. 单文件组合排查
Terminal
# 忽略大小写、显示行号,并查看前后 3 行
$ grep -inC 3 "error" app.log
128:2026-07-02 10:15:23 ERROR database connection failed
该命令表示忽略大小写查找 error,显示匹配行号,并输出匹配行前后各 3 行内容。
2. 目录级组合排查
Terminal
# 在指定目录中递归查找 timeout
$ grep -rin "timeout" /var/log/myapp/
/var/log/myapp/app.log:241:request timeout after 30000ms
该命令表示在 /var/log/myapp/ 目录中递归查找 timeout,忽略大小写,并显示匹配行号。
假设应用日志中出现数据库连接失败,需要定位相关错误信息,可以直接使用错误短语作为检索关键字,并同时输出行号和上下文。
Terminal
# 定位数据库连接失败并查看上下文
$ grep -inC 5 "database connection failed" app.log
128:2026-07-02 10:15:23 ERROR database connection failed
该命令会在 app.log 中查找数据库连接失败相关日志,并展示匹配行前后各 5 行内容,从而确认错误发生时间、相关请求信息和异常上下文。
grep 的核心作用,是从大量日志文本中筛选出符合条件的记录。对于错误定位来说,关键字检索负责找到目标日志,行号用于确认位置,上下文参数用于还原错误发生前后的关联信息。
在实际排查中,可以先从明确的错误关键字入手,再根据日志规模选择单文件检索、多文件检索或目录递归检索。结合 -n、-i、-C、-r 和 -c 等参数,可以更高效地完成日志错误筛选与初步定位。