【问题标题】:How to tail the last nth lines of a file that is located in a compressed tar file如何拖尾位于压缩 tar 文件中的文件的最后 n 行
【发布时间】:2020-09-20 19:23:02
【问题描述】:

Ubuntu 16.04
重击 4.4.20

我想跟踪位于 tar.gz 文件中的 SQL 文件的最后 30 行。我注意到 SQL 备份由于文件锁定而失败。我不想解压整个压缩文件,而是简单地尾随 SQL 备份,然后 grep 查找某些短语。

StackOverflown Thread 解释说压缩文件无法做到这一点。这是否也适用于像这样创建的 tar 文件:

tar czf name.tar.gz foldername  

如果这在其他帖子中有解释,请删除这个帖子,我会继续搜索。

【问题讨论】:

  • 您链接到的答案并没有说出您要解释的内容。这对于 zip 文件是完全可能的。
  • ...嗯,这是正确的错误。正确的是,解压缩器必须从给定文件的开头开始,因此 tail 仍将执行解压缩文件的工作,但会丢弃该工作,直到它到达您要求的最后 N 行。但是声称你不能编写一个命令,它只会给你一个 zip 文件的最后 N 行而不在磁盘上创建任何临时文件,这是错误的。
  • ...也就是说,zip 文件实际上比tar.gz 文件在seek() 周围更容易。使用.tar.gz,您必须按照从头到尾的顺序进行.gz 解压缩。使用 zip 文件时,它有一个页脚,说明存档中每个解压缩流的位置,因此读者可以跳转到它想要读取的特定文件,而无需先解压缩它之前的文件(如 .tar.gz 所必需的) .
  • ...无论如何,您可以选择使用 zip 吗?鉴于您的既定目标,如果您可以选择,tar.gz 是错误的存档格式。 (再说一次,如果您对存档有完全的控制权,为什么不在其中有一个您想要 grep 的特定内容的文件?)
  • 无论如何:我可以给你一个答案,从字面上做你所要求的,但它会很慢,因为它仍然会做读取和解压缩数据尾的工作正在扔掉,这可以说完全违背了使用 tail 的观点。 (假设grepgunzip 快,并且您有大量的CPU 资源,那么您甚至可能不会比完全不使用tail 的代码获得挂钟时间优势。

标签: bash tar tail


【解决方案1】:

您可以使用 tar 的 -O 选项打印文件内容,然后使用 | (pipe),您可以应用基本的 unix 操作,例如 tail:

tar zxvf name.tar.gz <file_to_read> -O | tail

示例命令,读取文件 A1.txt 的最后两行

tar zxvf B.tar.gz B/A1.txt -O | tail -2

这里 B 是我运行 tar 命令的目录,它包含许多文件以及文件 A1.txt

【讨论】:

  • 需要注意的是tail不能seek()当给定一个FIFO,这意味着文件仍然需要解压并从最前面读取(同样,tar也在从远处读取档案)。就使用tail 而言,这完全是为了性能,这里可能无法实现。
猜你喜欢
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
相关资源
最近更新 更多