【问题标题】: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。

标签: linux awk sed grep


【解决方案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
      

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

      【讨论】:

        猜你喜欢
        • 2019-05-20
        • 2018-09-08
        • 2013-07-16
        • 2013-12-08
        • 1970-01-01
        • 2015-01-09
        • 2019-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多