使用命令 sed 更改日志文件日期?

Alter log file date with the command sed?

我在包含其他数据的日志文件中多次出现以下行。 我喜欢通过首先将 json 部分导入 mongodb 并在其上选择 运行 查询来分析此数据。

DEBUG 2015-04-18 23:13:23,374 [TEXT] (Class.java:19) - {"a":"1", "b":"2", ...}

改变数据只是为了得到我使用的 json 部分:

cat mylog.log | sed "s/DEBUG.*19) - //g" > mylog.json

这里的主要问题是,这就像添加日期和时间部分以及附加的 json 值以获得类似这样的内容:

{"date": "2015-04-18", "time":"23:13:26,374", "a":"1", "b":"2", ...}

这是主要问题。我如何使用 linux 控制台和命令 sed 来做到这一点?或者通过替代控制台命令?

提前谢谢

由于这似乎是一种非常严格的格式,您可以像这样使用 sed:

sed 's/DEBUG \([^ ]*\) \([^ ]*\).*19) - {/{ "date": "", "time": "", /' mylog.log

其中 [^ ]* 匹配一系列非 space 字符,\(regex\) 是一个捕获组,使匹配的字符串可用于替换为 </code> , <code>, 等等取决于它的位置。你可以看到这些用于替换部分。

不过,如果是我,我会使用 Perl,因为它能够将一行拆分为字段并进行非贪婪匹配:

perl -ape 's/.*?{/{ "date": "$F[1]", "time": "$F[2]", /' mylog.log

后者替换第一个{之前的所有内容(因为.*?非贪婪地匹配)并将其替换为您想要的字符串。 $F[1]$F[2] 是该行中第二个和第三个以白色 space 分隔的字段; -a 使 Perl 以这种方式将行拆分为 @F 数组。