提取多个 .gz 文件,并打印提取文件的名称

提取多个 .gz 文件,并打印提取文件的名称

我认为这很容易,但我阻止了……

我有一个包含一系列日志文件的目录(来自 minecraft 服务器......):

2014-09-28-1.log.gz
2014-09-29-1.log.gz
2014-09-30-1.log.gz
2014-10-01-1.log.gz
2014-10-02-1.log.gz
latest.log

我想提取用户登录的日期和时间。但是,当我这样做时

gzcat *.gz | grep 'logged in'

我得到如下输出:

[19:26:03] [Server thread/INFO]: Foo[/ip address] logged in with entity id 193955 at (location)
[18:26:08] [Server thread/INFO]: Baz[/ip address] logged in with entity id 194873 at (location)
[01:16:38] [Server thread/INFO]: User[/ip address] logged in with entity id 198895 at (location)

ETC。

不幸的是,虽然我得到了时间戳,但我没有得到日期。理想的输出应该是

2014-10-03 19:26:03 Foo logged in
2014-10-04 18:26:08 Baz logged in
2014-10-05 01:16:38 User logged in

我意识到我可能需要编写awk脚本才能获得“理想”的输出。但是有没有一种简写(非 awk)解决方案可以只获取散布在列表中的日期?像这样:

2014-10-03-1.log.gz
[19:26:03] [Server thread/INFO]: Foo[/ip address] logged in with entity id 193955 at (location)
2014-10-04-1.log.gz
[18:26:08] [Server thread/INFO]: Baz[/ip address] logged in with entity id 194873 at (location)
2014-10-05-1.log.gz
[01:16:38] [Server thread/INFO]: User[/ip address] logged in with entity id 198895 at (location)

(即每个文件内 grep 位之前的文件名)已经非常有用。

请注意,每个日志文件中通常还有许多其他条目 - 可能有多个登录和其他消息(我今天对此不感兴趣)。

简而言之,我的问题是:

我是否可以以某种方式在将该 zip 文件的内容传递到进一步处理gzcat之前打印每个 zip 文件的名称?grep

可以编写一个脚本来完成整个事情;但我正在寻找一些更聪明的东西(我想知道是否tee可以用来打印文件名stderr以及作为参数传递给grep。)

答案1

这是gzcatgzip软件包提供的吗?在我的 openSUSE GNU/Linux 机器上,二进制文件名为zcat。如果gzip你的机器上确实安装了 ,那么你还应该有另一个二进制文件名为zgrep,它只是一个将文件解压缩stdout并调用的shell 脚本grep

zgrep接受 (几乎) 与 相同的参数集grep。因此您可以这样做:

$ zgrep -H'已登录'*.gz`

这将返回以下格式的输出:

2014-10-03-1.log.gz:[19:26:03] [服务器线程/INFO]: Foo[/ip 地址] 使用实体 ID 193955 登录于 (位置)

你可以用.gz:空格代替,或者用接近你的trsed理想输出

相关内容