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

时间:2018-09-07 19:50:36

标签: linux awk sed grep

我有多个压缩后的日志文件,其文本之间的格式为:

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

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

是否有一种方法可以将结果仅限制为键值对。有没有一种方法也可以将有趣的值过滤到只有数字而没有字母的值呢?

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

4 个答案:

答案 0 :(得分:2)

您要

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

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

答案 1 :(得分:1)

使用grep前瞻,here

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

对于文件,

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

对于压缩文件,可以使用zgrep代替grep。相同的选项应该起作用。

答案 2 :(得分:0)

另一个,

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

如果您将其作为比赛的一部分,甚至可以删除引号。

答案 3 :(得分:0)

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

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

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