【问题标题】:Extracting key word from a log line从日志行中提取关键字
【发布时间】:2016-12-27 17:11:03
【问题描述】:

我有一个这样的日志:

.....client connection.....remote=/xxx.xxx.xxx.xxx]].......

我需要提取日志中包含上述内容的所有行,并仅打印remote=. 之后的 ip。这将是模式中的一些东西:

grep "client connection" xxx.log | sed -e ....

【问题讨论】:

  • 你试过什么?我们这里的大多数人都很乐意帮助你提高你的手艺,但作为短期无偿编程人员不太乐意。在MCVE 中向我们展示您迄今为止的工作、您期望的结果和您得到的结果,我们将帮助您解决问题。
  • 代表接近 2K 的用户现在应该知道不要ask volunteers for urgency

标签: linux sed grep


【解决方案1】:

使用 grep:

grep -oP '(?<=remote=/)[^\]]+' file

o 是只提取模式,而不是整行。 P 是匹配 perl 之类的正则表达式。在这种情况下,我们使用的是“消极的后视”。它将尝试匹配不是“]”的字符集,前面有remote=/

【讨论】:

  • 一种更强大的方法是将模式 client connection 包含到 grep 中,因为这是 OP 需要的。您的逻辑可能还包括同一行中没有 client connection 的行。
【解决方案2】:
grep -oP 'client connection.*remote=/\K.*?(?=])' input

在包含client connection 的行上打印remote=/ 和最近的] 之间的任何内容。

或通过使用sed 反向引用:这里将行分为三个部分/组,稍后由\1 \2\3 引用。每个组都由() 包围。这里的IP地址属于第二组,所以整行被第二组代替,即IP地址。

sed -r  '/client connection/ s_(^.*remote=/)(.*?)]](.*)_\2_g' input

或者使用awk

awk -F'/|]]' '/client connection/{print $2}' input

【讨论】:

    【解决方案3】:

    试试这个:

    grep 'client connection' test.txt | awk -F'[/\\]]' '{print $2}'
    

    测试用例

    test.txt
    ---------
    abcd
    .....client connection.....remote=/10.20.30.40]].......
    abcs
    .....client connection.....remote=/11.20.30.40]].......
    .....client connection.....remote=/12.20.30.40]].......
    

    结果

    10.20.30.40
    11.20.30.40
    12.20.30.40
    

    说明

    grep 会将结果列入仅匹配客户端连接的行。 awk 使用 -F 标志作为分隔符来分割文本。我们要求awk 使用/] 分隔符来分割文本。为了使用多个分隔符,我们将分隔符放在[] 中。例如,要按=: 分割文本,我们会使用[=:]

    但是,在我们的例子中,分隔符之一是],因为我的意图是通过使用/] 将文本从/x.x.x.x] 中提取IP。所以我们逃避它]。 IP 是拆分后的第二项。

    【讨论】:

      【解决方案4】:

      this answer 改进的更强大的方法是在PCRE 模式下也使用GNU grep-P 用于perl 样式regEx 匹配,但同时匹配问题中建议的两种模式.

      grep -oP "client connection.*remote=/\K(\d{1,3}\.){3}\d{1,3}" file
      10.20.30.40
      11.20.30.40
      12.20.30.40
      

      这里,client connection.*remote 匹配行中的模式并从文件中提取 IP。 \KPCRE 语法,用于忽略到该点的字符串并仅打印其后的捕获组。

      (\d{1,3}\.){3}\d{1,3}
      

      要匹配 IP,即 3 由长度点分隔的数字组,从 13,后跟 4th 八位字节。

      【讨论】:

        猜你喜欢
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        • 2019-10-20
        • 1970-01-01
        相关资源
        最近更新 更多