如何不解压tar包,从包内的gz日志文件中grep指定字符串
问题解决方法
命令执行错误原因
- 第一次执行的命令问题:
xargs将tar包路径直接传入zgrep,而zgrep仅支持处理单个gzip格式压缩文件,无法识别tar归档的内部结构,无法读取归档内的gz日志内容。 - 第二次执行的命令问题:
tar -tf仅输出tar包内的文件名列表,管道传递给find不会生效,find默认检索本地磁盘的文件系统,不会读取管道输入的内容,后续zgrep没有有效输入源,因此无结果。
正确实现方案
方案1:直接批量检索(速度更快)
无需解压tar包到磁盘,直接提取所有匹配的日志文件内容到标准输出交给zgrep检索:
tar -xf /backup/tmp/APPLOG-P10-2021-07-09.tar --wildcards 'APPLOG/*/logs/domeus.log.2021-07-09.gz' -O | zgrep 'Id=6700409965' >> ~/tmp/2021_07_09.txt
参数说明:
--wildcards:启用通配符匹配tar包内的文件路径-O:将提取的文件内容输出到标准输出,不会写入本地磁盘
方案2:带源文件标识的检索
如果需要知道匹配的日志属于tar包内哪个主机的日志,可以用循环遍历的方式:
# 先创建空结果文件 > ~/tmp/2021_07_09.txt # 遍历tar包内符合条件的日志文件 tar -tf /backup/tmp/APPLOG-P10-2021-07-09.tar | grep 'domeus.log.2021-07-09.gz' | while read log_path; do echo ">>> 匹配来源:${log_path}" >> ~/tmp/2021_07_09.txt tar -xf /backup/tmp/APPLOG-P10-2021-07-09.tar -O "${log_path}" | zgrep 'Id=6700409965' >> ~/tmp/2021_07_09.txt done
内容的提问来源于stack exchange,提问作者Haitham
相关产品推荐
相关产品推荐

