5.4.1 常用文本处理工具概览(grep/egrep)

常用文本处理工具概览(grep/egrep)#

grep 是文本检索的基础工具,适用于日志、配置、输出流的快速过滤;egrep 等价于 grep -E,支持扩展正则。运维场景中常与管道组合使用,完成定位、统计与告警前置过滤。

原理草图(匹配流程)

文章图片

安装与验证
- 大多数发行版默认安装 grep,可通过包管理器确认或安装。

# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y grep

# RHEL/CentOS/Alma/Rocky
sudo yum install -y grep

# 验证版本
grep --version

常用参数速览与命令解释
- -i 忽略大小写;-v 反向匹配;-n 输出行号;-r/-R 递归目录
- -c 统计匹配行数;-o 仅输出匹配内容;-w 单词边界匹配
- -E 启用扩展正则(= egrep);-F 固定字符串;-P PCRE(兼容性需确认)

示例准备(测试文件)

mkdir -p /tmp/grep_demo
cat >/tmp/grep_demo/app.log <<'EOF'
2024-01-01 10:00:01 INFO user=alice action=login ip=10.0.0.1
2024-01-01 10:00:02 WARN user=bob action=login ip=10.0.0.2
2024-01-01 10:00:03 ERROR user=alice action=pay ip=10.0.0.1 code=E500
2024-01-01 10:00:04 DEBUG user=carol action=logout ip=10.0.0.3
2024-01-01 10:00:05 INFO user=bob action=logout ip=10.0.0.2
EOF

基础检索与输出控制

# 1) 查找错误行(-i 忽略大小写)
grep -i "error" /tmp/grep_demo/app.log

# 2) 输出行号(-n)
grep -n "WARN" /tmp/grep_demo/app.log

# 3) 反向排除调试日志(-v)
grep -v "DEBUG" /tmp/grep_demo/app.log

# 4) 仅输出匹配片段(-o)
grep -o "ip=[0-9.]\+" /tmp/grep_demo/app.log

# 5) 统计匹配行数(-c)
grep -c "login" /tmp/grep_demo/app.log

扩展正则(egrep/grep -E)

# 1) 同时匹配 WARN 或 ERROR
grep -E "WARN|ERROR" /tmp/grep_demo/app.log

# 2) 提取 IP(扩展正则)
grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" /tmp/grep_demo/app.log

# 3) 匹配 action=login 或 action=logout
grep -E "action=(login|logout)" /tmp/grep_demo/app.log

管道组合示例(与 awk/wc 配合)

# 统计 ERROR 数量
grep -i "error" /tmp/grep_demo/app.log | wc -l

# 过滤 ERROR/WARN 并提取时间与用户
grep -E "ERROR|WARN" /tmp/grep_demo/app.log | awk '{print $1,$2,$4,$5}'

# 多条件筛选:登录事件且排除 DEBUG
grep -E "action=login" /tmp/grep_demo/app.log | grep -v "DEBUG"

递归搜索与配置审计

# 在配置目录中递归查找敏感配置(-r)
grep -R "password" /etc 2>/tmp/grep_demo/err.log

# 输出包含行号与文件名(-n)
grep -Rn "server_name" /etc/nginx 2>/tmp/grep_demo/err.log

常见问题与排错
1. grep -P 不支持

# 查看是否支持 PCRE
grep -P "test" /tmp/grep_demo/app.log
# 若报错,可改用 -E 或安装支持 PCRE 的 grep
  1. 匹配不到预期内容(正则过严/大小写)
# 使用 -i 或简化正则逐步验证
grep -i "error" /tmp/grep_demo/app.log
grep -E "ERROR|WARN" /tmp/grep_demo/app.log
  1. 递归搜索权限不足
# 将错误输出重定向并缩小范围
grep -R "keyword" /etc/nginx 2>/tmp/grep_demo/err.log

性能与最佳实践
- 固定字符串优先使用 -F 提升性能。
- 大文件建议先 grep -F 粗筛,再用正则精筛。
- 递归搜索前明确目录范围,避免全盘扫描。

练习题
1. 统计 /tmp/grep_demo/app.loguser=alice 的行数,并输出包含行号的列表。
2. 提取所有 code=E*** 的错误码(仅输出错误码)。
3. 搜索 /etc/nginx 中包含 listen 80 的配置行并显示文件名与行号。
4. 将 WARNERROR 行按时间字段(前两列)输出。

小结
grep/egrep 是文本处理链路的起点,熟悉参数、正则与管道组合,可显著提升日志排障与脚本自动化效率,为后续 sed、awk 与组合命令打好基础。