Pra*_*kar 17 logs gzip shell-script
我有一个以 .gz 格式压缩的巨大日志文件,我只想读取它的第一行而不解压缩它以检查文件中最早日志的日期。
日志格式如下:
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
Run Code Online (Sandbox Code Playgroud)
我只想读取第一行中的日期,对于未压缩的文件,我会这样做:
read logdate otherstuff < logfile.gz
echo $logdate
Run Code Online (Sandbox Code Playgroud)
使用 zcat 花费的时间太长。
Ste*_*itt 34
Pipeingzcat
的输出 tohead -n 1
将解压缩少量数据,保证足以显示第一行,但通常不超过几个缓冲区满(在我的实验中为 96 KiB):
zcat logfile.gz | head -n 1
Run Code Online (Sandbox Code Playgroud)
一旦head
读完一行,它就会关闭它的输入,从而关闭管道,并zcat
在接收到 a 后停止SIGPIPE
(当它下一次尝试写入关闭的管道时会发生这种情况)。你可以通过运行看到这一点
(zcat logfile.gz; echo $? >&2) | head -n 1
Run Code Online (Sandbox Code Playgroud)
这将显示zcat
以代码 141 退出,这表明它由于SIGPIPE
(13 + 128)而停止。
您可以添加更多后处理,例如使用 AWK,仅提取日期:
zcat logfile.gz | awk '{ print $1; exit }'
Run Code Online (Sandbox Code Playgroud)
(在 macOS 上,您可能需要使用gzcat
而不是zcat
处理 gzipped 文件。)
zcat
您可以限制提供给( 或)的数据量gzip -dc
,然后请求第一行:
head -c 1000 logfile.gz | zcat 2>/dev/null | head -1 | read logdate otherstuff
Run Code Online (Sandbox Code Playgroud)
1000
如果没有捕获足够的数据来获取整个第一行,请调整。
仅匹配压缩文件第一行的日期 -zgrep
解决方案:
zgrep -m1 -o '^[^[:space:]]*' logfile.gz
Run Code Online (Sandbox Code Playgroud)
YYYY-MM-DD
这将为您输出第一个。