无法从日志文件中提取准确的键值对
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
由于它循环遍历所有元素,因此速度有些慢。
【讨论】:
以上是关于无法从日志文件中提取准确的键值对的主要内容,如果未能解决你的问题,请参考以下文章