ter*_*don 7 command-line shell compression
我有 6 个 gzip 压缩的文本文件,每个压缩后大约为 17G。我需要查看每个文件的最后几行(已解压)以检查是否存在特定问题。显而易见的方法很慢:
for i in *; do zcat "$i" | tail -n3; done
Run Code Online (Sandbox Code Playgroud)
我在想我可以做一些聪明的事情,比如:
for i in *; do tail -n 30 "$i" | gunzip | tail -n 4 ; done
Run Code Online (Sandbox Code Playgroud)
或者
for i in *; do tac "$i" | head -100 | gunzip | tac | tail -n3; done
Run Code Online (Sandbox Code Playgroud)
但双方都抱怨:
gzip: stdin: not in gzip format
Run Code Online (Sandbox Code Playgroud)
我认为那是因为我缺少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
Run Code Online (Sandbox Code Playgroud)
我真正在寻找的是一个ztail或ztac但我认为这些不存在。谁能想出一个聪明的技巧,让我解压缩并打印压缩文件的最后几行而不解压缩整个文件?
好吧,如果您之前为每个文件创建了索引,则可以随机访问一个 gzip文件...
我开发了您可能正在寻找的命令行工具:它可以使用与 gunzip 相同的时间访问尾部...但是因为它创建了一个小 (<<1%/gzip) 索引,下次提取会很快:
https://github.com/circulosmeos/gztool
该工具有两个您可能感兴趣的选项:
$ gztool -t foo.gz
请注意,如果索引不存在,这将消耗与完全解压相同的时间:但由于索引是可重用的,下次搜索将大大减少时间 - 因为它是同一时间,为什么不使用它并同时创建索引?该工具基于原始 zlib 的 zran.c 演示代码,因此没有超出规则的魔法!