【问题标题】:Shell command grep a record from a .TAR file that holds .GZ filesShell 命令 grep 来自包含 .GZ 文件的 .TAR 文件的记录
【发布时间】:2021-12-26 22:11:26
【问题描述】:

我正在尝试从已归档的 .tar 文件中的特定 .gz 文件中 grep 字符串。

tar 文件的内容在每个主机上都有一个存档,类似于:

APPLOG/cp13ap011/logs/domeus.log.2021-07-09.gz
APPLOG/cp15ap043/logs/domeus.log.2021-07-09.gz
APPLOG/cp14ap411/logs/domeus.log.2021-07-09.gz
APPLOG/cp11ap231/logs/domeus.log.2021-07-09.gz

我找到了文件位置 find /backup/tmp/ -type f -name 'APPLOG-P10-2021-07-09.tar' |xargs zgrep -F 'communicationId=6700409965' >> ~/tmp/2021_07_09.txt

当我意识到它是一个 .tar 文件时,在演示中保存着记录

tar -tf APPLOG-P10-2021-07-09.tar -O |find APPLOG/ -type f -name 'domeus.log.2021-07-09*' | xargs zgrep -E "Id=6700409965" >> ~/tmp/2021_07_09.txt

文件位于APPLOG/domeus.log.2021-07-09.gz这里有多台机器保存记录,但所有机器都会有一个重复的文件名domeus.log.2021-07-09*并且文件很大,因此需要细化字符串"Id=6700409965"

最终它没有让我得到这些文件的结果

-rw-r--r-- 1 0 Nov 15 16:58 2021_07_09.txt

诀窍,除非没有其他选项,否则我不想解压缩文件

【问题讨论】:

  • tar | find 没有意义。 find 不从标准输入读取,所以它不会看到任何 tar 正在发送它。
  • 高效执行此操作有多重要?如果它非常重要,我会使用不同的语言,例如 Python,其中 tarfile 模块让您一次性完成所有这些工作。在 bash 中执行此操作的简单方法包括两次读取输入文件(一次获取可用名称,一次提取具有您关心的特定名称的内容)。
  • @CharlesDuffy,我很想这样做,但我几乎无法在我们的备份上做任何事情
  • 我不知道你的意思是:没有访问权限。你的意思是你没有可用的 Python 解释器吗? (这在现代系统上会令人惊讶;Python 已经内置到大多数 Linux 发行版中已有 20 年了)。
  • @MartinSchapendonk,对,问题是 OP 在开始之前是否具有该特定 gz 文件的完整文件名。 (如果他们这样做了,他们为什么要使用find?)

标签: shell tar archive


【解决方案1】:

不幸的是,在 bash 中执行此操作将需要多次传递 - 在 Python 中会更有效,其中 tarfile 模块让您既可以决定要检查哪些文件,又可以读取这些文件的内容,一次通过。

while IFS= read -r -d '' tarfile; do
  tar -xf "$tarfile" -T <(
    tar -tf "$tarfile" |
      grep -E 'APPLOG/(.*)/logs/domeus[.]log[.]2021-07-09[.]gz'
  ) -O |
    gunzip -c |
    grep 'Id=6700409965'
done < <(find /backup/tmp/ -type f -name 'APPLOG-P10-2021-07-09.tar' -print0) \
     >~/tmp/2021_07_09.txt

为所使用的各个技术提供文档:

  • while read 循环在 BashFAQ #1 中有详细讨论。
  • &lt;(...)process substitution 语法 - 它扩展为一个文件名,可以从中读取 ... 的输出,这是在使用命名管道或等效物实现的现代平台上(因此不需要编写内容到磁盘,进程可以并行运行)。
  • tar -T 期望下一个参数是要操作的文件名列表。

【讨论】:

  • tar:选项需要一个参数 -- 'C' 尝试使用 'tar --help' 或 'tar --usage' 以获得更多信息。 gzip:标准输入:文件意外结束
  • 抱歉,应该是-O,而不是-C
  • @Haitham,已经有几天了,所以我很好奇你在哪里——如果你的 devops 员工有更好的方法,有没有机会在这里找到答案?修复-O/-C thinko 后您是否尝试过重新运行?
猜你喜欢
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多