关键是用引号包裹变量、优先使用grep -f进行字面匹配、对空值和非法值做兜底处理,以确保动态变量安全准确参与系统指标检索。

在自动化脚本中用 grep 结合动态变量做系统指标检索,关键是让变量值安全、准确地参与匹配,同时避免 shell 解析错误或正则误匹配。
变量要加引号防止空格和特殊字符破坏命令
未加引号的变量可能被 shell 拆分成多个参数,尤其含空格、星号、括号时会出错。比如查某个进程名:
- ❌ 错误写法:
grep $PROCESS_NAME /proc/loadavg(若 PROCESS_NAME="nginx worker" 就变成 grep nginx worker /proc/loadavg,实际只搜 "nginx") - ✅ 正确写法:
grep "$PROCESS_NAME" /proc/loadavg或更稳妥的grep -F "$PROCESS_NAME" /proc/loadavg(-F 关闭正则,按字面匹配)
用 -E 或 -F 明确匹配模式,避免变量内容被当正则元字符处理
如果变量值含 .、*、[ 等,不加 -F 会导致意外匹配。例如查磁盘使用率阈值:
- 变量
THRESHOLD="85%",直接grep $THRESHOLD df.out可能因%无害但.或+出问题 - 推荐统一用
grep -F "$THRESHOLD"—— 字面匹配,语义清晰,不易出错 - 如需正则(比如查“CPU usage: 7[0-9]%”),则用
grep -E "$PATTERN",并确保变量本身已转义或由脚本生成
配合命令替换和管道,实现指标链式提取
系统指标常需多步过滤,变量可嵌入任意环节。例如查指定用户的内存占用 top 行:
USER_NAME="admin"; top -bn1 | grep "$USER_NAME" | grep -oE '[0-9]+\.[0-9]+%.*RSS' | head -1- 注意:
top -bn1输出不稳定,生产环境建议改用ps+awk更可靠;但 grep 配合变量仍适合快速筛选 - 变量也可来自命令结果:
CURRENT_DISK=$(df / | awk 'NR==2 {print $5}' | sed 's/%//'); grep -F "${CURRENT_DISK}%" /var/log/monitor.log
用 \${VAR:-default} 防止空变量导致 grep 报错或匹配全行
空变量传给 grep 会变成 grep "" file,输出所有行,容易掩盖问题:
- 加默认值:
grep -F "${SERVICE_NAME:-nginx}" /etc/systemd/system/*.service - 或提前校验:
if [ -z "$SERVICE_NAME" ]; then echo "SERVICE_NAME not set"; exit 1; fi - 对数值型指标,还可加数字校验:
[[ "$THRESHOLD" =~ ^[0-9]{1,3}$ ]] || { echo "invalid threshold"; exit 1; }
核心就三点:引号包住变量、-F 优先保安全、空值和非法值要有兜底。写多了自然就成肌肉记忆了。











