无法从日志文件中提取准确的键值对

Posted

技术标签:

【中文标题】无法从日志文件中提取准确的键值对【英文标题】:Unable to Extract exact key value pairs from log files 【发布时间】:2018-09-07 19:50:35 【问题描述】:

我有多个 gzip 压缩的日志文件,在格式的行之间有文本:

someRandomText... ,"interestingKey":"interestingValue",moreRandomText

为此我尝试了zgrep -o -i '"interestingKey":[^ ]*' logs* 即使它找到了相关的行,它也会在行上的 grepped 模式之前和之后输出文本。

有没有办法将结果限制为键值对。有没有一种方法也可以将interestingValue 过滤到只有数字而没有字母的那些?

注意:密钥必须不区分大小写。钥匙总是一样的。价值总是不同的。

【问题讨论】:

那个“随机文本”看起来像 JSON。是吗? 日志中还包含大量文本和json。 【参考方案1】:

你想要:

zgrep -oiP '"interestingKey":"\K[^"]*' 

那会 在引号中找到键名,后跟冒号和值的开始引号。 然后\K 指令“忘记”到目前为止匹配的文本。 然后我们匹配一些非引号字符,-o 会发出这些字符。

【讨论】:

【参考方案2】:

使用grep前瞻,here

$ echo 'someRandomText... ,"interestingKey":"interestingValue",moreRandomText' | grep -oP '(?<=interestingKey":).*(?=,)'
"interestingValue"

对于一个文件,

$ grep -oP '(?<=interestingKey":).*(?=,)' inputFile

您可以使用zgrep 而不是grep 来压缩压缩文件。相同的选项应该可以工作。

【讨论】:

这几乎是我感兴趣的。但它也会在值之后给出一些东西。您可以假设该值始终以引号结尾。现在它打印到行尾 它打印interestingKey": 和下一个逗号(,)之间的所有内容。它不应该打印到行尾。注意,lookahead 输入模式必须是固定的。【参考方案3】:

另一个,

$ ... | grep -oP '(?<=interestingKey":)[^,]+'

如果你把它作为匹配的一部分,你甚至可以去掉引号。

【讨论】:

【参考方案4】:

可以使用awk 完成,但这不是最好的解决方案。

awk -F, 'for(i=1;i<=NF;i++)if($i~/interestingKey/)print $(i+1)' file
moreRandomText

由于它循环遍历所有元素,因此速度有些慢。

【讨论】:

以上是关于无法从日志文件中提取准确的键值对的主要内容,如果未能解决你的问题,请参考以下文章

如何从字典列表中向现有键值对添加新的键值对?

mysql日志详解

从一维条码中读取的键值对的有效压缩和表示

PHP从多个json文件中的键值排序结果

无法从分离的线程访问 C++ unordered_map 中的键值对

在所有文件中找到JSON键,并删除相应的键值对。