根据关键字搜索日志内容,常用的Linux命令
在 Linux 中,根据关键字搜索日志内容是运维和开发的常见需求。以下是常用的命令及场景示例:
1. grep
基础搜索
(1) 简单关键字匹配
# 在文件中搜索包含 "error" 的行 grep "error" /var/log/nginx/error.log# 忽略大小写(-i) grep -i "warning" /var/log/syslog# 显示匹配行的行号(-n) grep -n "timeout" app.log
(2) 多关键字搜索
# 同时匹配 "error" 或 "critical"(-E 启用正则) grep -E "error|critical" /var/log/app.log# 匹配同时包含 "user123" 和 "login" 的行(需顺序出现) grep "user123.*login" auth.log
2. 上下文显示
# 显示匹配行及其后5行(-A) grep -A 5 "panic" system.log# 显示匹配行及其前3行(-B) grep -B 3 "connection refused" network.log# 显示匹配行前后各2行(-C) grep -C 2 "oom killer" kern.log
3. 递归搜索目录
# 在 /var/log 目录下所有文件中搜索 "segmentation fault" grep -r "segmentation fault" /var/log# 仅显示文件名和匹配内容(-H) grep -rH "404" /var/log/nginx/
4. 反向匹配(排除关键字)
# 排除包含 "debug" 的行 grep -v "debug" app.log# 排除空行和注释行(多个条件) grep -v -E "^$|^#" config.conf
5. 结合 find
搜索多个文件
# 查找所有 .log 文件并搜索 "out of memory" find /var/log -name "*.log" -exec grep "out of memory" {} +# 最近7天修改过的日志中搜索 find /opt/app/logs -name "*.log" -mtime -7 -exec grep "timeout" {} \;
6. 实时监控日志(tail
+ grep
)
# 实时追踪日志并过滤关键字 tail -f /var/log/nginx/access.log | grep "POST /login"# 高亮显示匹配内容(需要 `grep --color`) tail -f app.log | grep --color -E "error|warning"
7. 使用 awk
高级过滤
# 提取日志中特定列(如第4列状态码为500的行) awk '$9 == 500 {print}' /var/log/nginx/access.log# 结合时间范围过滤(假设时间在第4列) awk '/2023-10-25 14:/, /2023-10-25 15:/' /var/log/app.log
8. 使用 sed
处理日志
# 提取两个关键字之间的内容 sed -n '/START/,/END/p' transaction.log# 替换日志中的敏感信息 sed 's/密码:.*/密码:******/g' auth.log
9. 压缩日志搜索
# 直接搜索 .gz 压缩文件 zgrep "502 Bad Gateway" /var/log/nginx/access.log.1.gz# 搜索多个压缩文件 zcat /var/log/nginx/*.gz | grep "404"
10. 统计匹配结果
# 统计匹配行数(-c) grep -c "GET /api" access.log# 统计每个匹配关键字的出现次数 grep -o "exception type:[A-Za-z]*" app.log | sort | uniq -c
11. 高亮显示(需终端支持)
# 使用 `grep` 自带高亮 grep --color=auto "ERROR" app.log# 使用 `ack` 工具(更友好的高亮) ack "WARNING" /var/log/*.log
12. 组合管道操作
# 复杂示例:搜索错误,排除测试用户,统计前10 grep "ERROR" app.log | grep -v "testuser" | cut -d' ' -f4- | sort | uniq -c | sort -nr | head -10
总结表格
场景 | 命令示例 |
---|---|
简单关键字搜索 | grep "error" file.log |
实时监控日志 | tail -f logfile | grep "keyword" |
多文件递归搜索 | grep -r "panic" /var/log |
排除干扰项 | grep -v "debug" app.log |
压缩文件搜索 | zgrep "404" access.log.gz |
统计错误类型 | grep -o "Error:\w*" app.log | sort | uniq -c |
时间段过滤 | sed -n '/2023-10-25 14:00:/,/2023-10-25 15:00:/p' system.log |
注意事项
-
权限问题:日志文件通常需要
sudo
权限 -
性能优化:大文件搜索时尽量缩小范围(如先用
find
按时间过滤) -
正则表达式:复杂匹配建议使用
-E
启用扩展正则 -
日志轮转:注意搜索范围是否包含历史日志(如
*.log
,*.gz
)