![在压缩文件上使用 `tac`](https://linux22.com/image/37279/%E5%9C%A8%E5%8E%8B%E7%BC%A9%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BD%BF%E7%94%A8%20%60tac%60.png)
tac unzipped.log | grep -m1 pattern
工作得很好,但我无法tac
在压缩文件上使用该命令。
tac zipped.gz | zgrep -m1 pattern
什么也不返回。
有什么办法可以tac
在不解压我的文件的情况下使用吗?
答案1
gzip 作为从第一个字节到最后一个字节的流进行操作;你不能从中间开始减压。大多数压缩工具都会这样做,因为如果您允许从中间解压缩,那么您就无法充分利用开头和结尾之间的相似性。因此,要在 gzip 压缩文件中搜索字符串,您无论如何都需要解压缩整个文件(如果您只对第一个匹配项感兴趣,至少要解压到第一个匹配项)。
此外,tac
会反转行,而不是字节。由于解压缩的文件不分为行(它们是二进制文件,其中换行符与其他文件一样是一个字节),因此这会将文件弄乱成无法使用的内容。
您可以反转解压后的文件:
zcat zipped.gz | tac | grep -m1 pattern
然而,这不一定比搜索整个文件更快,因为tac
它本身并不那么快(大多数应用程序从头到尾读取,因此内核倾向于优化这种情况,然后tac
必须测试每个字节以查看它是否是换行符)。如果您只想要最后一行,则可以将其提取:
zcat zipped.gz | grep pattern | tail -n1