我有一个以 .gz 格式压缩的巨大日志文件,我只想读取它的第一行而不解压缩它来检查文件中最旧日志的日期。
日志的形式为:
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
我只想读取第一行中的日期,对于未压缩的文件我会这样做:
read logdate otherstuff < logfile.gz
echo $logdate
使用 zcat 花费的时间太长。
Piping
zcat
的输出head -n 1
将解压缩少量数据,保证足以显示第一行,但通常不超过几个缓冲区满(在我的实验中为 96 KiB):一旦
head
读完一行,它就会关闭它的输入,这会关闭管道,并zcat
在接收到 a 后停止SIGPIPE
(当它下次尝试写入关闭的管道时会发生这种情况)。您可以通过运行看到这一点这将显示
zcat
以代码 141 退出,这表明它因SIGPIPE
(13 + 128) 而停止。您可以添加更多后处理,例如使用 AWK,以仅提取日期:
(在 macOS 上,您可能需要使用
gzcat
而不是zcat
处理压缩文件。)您可以限制您提供给
zcat
(或gzip -dc
)的数据量,然后询问第一行:调整
1000
如果没有捕获足够的数据来获取整个第一行。仅匹配压缩文件第一行中的日期 -
zgrep
解决方案:这将为您输出第一个
YYYY-MM-DD
。如果您只想要第一行而不解压缩文件:
这会将压缩数据发送到标准输出而不对其进行解压缩,并且
awk
只会打印第一行。