You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本开发求助:给日志错误行添加固定前缀并写入文件

解决Shell脚本日志过滤与写入问题

嘿,我来帮你搞定这个脚本的问题!你的需求是从Cloudera服务器日志里抓取包含exception或critical的最新语句,加上前缀后写入文件,但原脚本的几个小问题导致它没法正常工作,我来一步步给你修正。

原脚本的问题分析

  • 管道顺序错误:tail -f后面没有指定日志文件,而且你把日志文件传给了egrep,这会让egrep直接读取文件内容,忽略tail -f的管道输入,等于前面的tail -f白跑了。
  • 没有捕获匹配内容:echo "EDHDEV:ERROR" >>subash.txt只是单独写入固定字符串,根本没把egrep过滤到的日志行加进去,两者完全没有关联。

方案1:实时监控日志并写入(适合持续追踪)

如果需要实时监控日志,一旦出现目标关键字就立即写入文件,用这个脚本:

tail -f /var/log/cloudera-scm-server/cloudera-scm-server.log | egrep -wi 'exception|critical' | while read -r line; do
    echo "EDHDEV:ERROR $line" >> subash.txt
done

解释:

  1. tail -f:实时追踪日志文件的新增内容
  2. egrep -wi 'exception|critical':忽略大小写匹配包含exception或critical的行
  3. while read -r line:逐行读取过滤后的日志内容
  4. echo "EDHDEV:ERROR $line" >> subash.txt:给每一行加上前缀,追加写入到subash.txt

方案2:获取最新的一条匹配日志(适合一次性执行)

如果不需要实时监控,只是想抓取当前日志里最新的一条匹配记录,用这个:

# 先过滤所有匹配行,再取最后一行(最新的)
egrep -wi 'exception|critical' /var/log/cloudera-scm-server/cloudera-scm-server.log | tail -n 1 | while read -r line; do
    echo "EDHDEV:ERROR $line" >> subash.txt
done

解释:

  1. egrep -wi ...:过滤出所有包含目标关键字的日志行
  2. tail -n 1:取过滤结果的最后一行,也就是最新的那条错误记录
  3. 后续步骤和方案1一样,加上前缀写入文件

额外提示

  • 如果不想重复写入相同的错误内容,可以在写入前判断一下是否已经存在(不过日志行带时间戳,一般不会重复)
  • 可以给subash.txt加上时间戳命名,比如subash_$(date +%Y%m%d).txt,避免日志文件过大

内容的提问来源于stack exchange,提问作者Subash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:41:06