我有 6 个 gzip 压缩文本文件,每个文件压缩后约为 17G。我需要查看每个文件的最后几行(解压缩)以检查是否存在特定问题。明显的方法非常慢:
for i in *; do zcat "$i" | tail -n3; done
我想我可以做一些聪明的事情,比如:
for i in *; do tail -n 30 "$i" | gunzip | tail -n 4 ; done
或者
for i in *; do tac "$i" | head -100 | gunzip | tac | tail -n3; done
但两人都抱怨:
gzip: stdin: not in gzip format
我认为这是因为我缺少gzip
标题,但这也失败了:
$ aa=$(head -c 300 file.gz)
$ bb=$(tail -c 300 file.gz)
$ printf '%s%s' "$aa" "$bb" | gunzip
gzip: stdin: unexpected end of file
我真正要找的是ztail
orztac
但我认为它们不存在。谁能想出一个聪明的技巧,让我解压缩并打印压缩文件的最后几行,而无需解压缩整个文件?
答案1
答案2
出色地,你可以如果您之前创建了一个,则随机访问一个 gzip 压缩文件指数对于每个文件...
我开发了您可能正在寻找的命令行工具:它可以使用与gunzip相同的时间访问尾部...但是因为它创建了一个小(<<1%/gzip)索引,下次提取将会非常快:
https://github.com/circulosmeos/gztool
该工具有两个您可能感兴趣的选项:
- -S选项监督仍在增长的文件并在其增长时为其创建索引 - 这对于 gzip 压缩的 rsyslog 文件非常有用,因为在实践中将创建索引的时间减少到零。
- -ttails一个gzip文件:这样你可以这样做:
$ gztool -t foo.gz
请注意,如果索引不存在,这将消耗与完全解压相同的时间:但由于索引是可重用的,下次搜索的时间将大大减少 -既然是同时,为什么不使用它并同时创建索引呢?
该工具基于来自原始 zlib 的 zran.c 演示代码,所以不存在不符合规则的魔法!