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
解释:
tail -f:实时追踪日志文件的新增内容egrep -wi 'exception|critical':忽略大小写匹配包含exception或critical的行while read -r line:逐行读取过滤后的日志内容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
解释:
egrep -wi ...:过滤出所有包含目标关键字的日志行tail -n 1:取过滤结果的最后一行,也就是最新的那条错误记录- 后续步骤和方案1一样,加上前缀写入文件
额外提示
- 如果不想重复写入相同的错误内容,可以在写入前判断一下是否已经存在(不过日志行带时间戳,一般不会重复)
- 可以给
subash.txt加上时间戳命名,比如subash_$(date +%Y%m%d).txt,避免日志文件过大
内容的提问来源于stack exchange,提问作者Subash
相关产品推荐
相关产品推荐

