我认为这很容易,但是我正在阻止…
我有一个包含一系列日志文件的目录(来自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)
等等。
不幸的是,当我获得时间戳记时,我没有得到日期。理想情况下,输出为
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)
(即每个文件内grepped位之前的文件名)已经非常有用。
请注意,每个日志文件中通常有许多其他条目-可以有多个登录名和其他消息(我今天对此不感兴趣)。
用最短的形式,我的问题变成:
gzcat
在传递该zip文件的内容以grep
进行进一步处理之前,我可以使用它打印每个zip文件的名称的方式吗?
我可以编写一个脚本来完成整个工作;但是我正在寻找更聪明的东西(我想知道是否tee
可以将文件名打印到stderr
以及作为参数传递给grep
,)。
这是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
获取接近理想输出的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句