我认为这很容易,但我阻止了……
我有一个包含一系列日志文件的目录(来自 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
这是gzcat
由gzip
软件包提供的吗?在我的 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:
空格代替,或者用接近你的tr
sed
理想输出。