【问题标题】:recursively match a column using regex使用正则表达式递归匹配列
【发布时间】:2014-08-01 15:04:05
【问题描述】:

我有一个格式如下的日志文件:

<134> 1 2014 Jul 31 18:48:03 - - MYAPP - [blablabla aNumber 10.70.4.126 bablabla - anotherIP 56389 anotherPortNumber - anotherIP anotherPortNumber ]

方括号中的模式可以在一行中重复 2 次或更多次,因此我的日志文件可能如下所示:

2014 Jul 31 18:48:03 - - MYAPP - [blablabla aNumber 10.70.4.126 bablabla - anotherIP 56389 anotherPortNumber - anotherIP anotherPortNumber ]
2014 Jul 31 18:48:03 - - MYAPP - [blablabla aNumber 10.70.4.126 bablabla - anotherIP 56389 anotherPortNumber - anotherIP anotherPortNumber ][blablabla aNumber 10.70.4.127 bablabla - anotherIP 56390 anotherPortNumber - anotherIP anotherPortNumber ]
2014 Jul 31 18:48:03 - - MYAPP - [blablabla aNumber 10.70.4.126 bablabla - anotherIP 56389 anotherPortNumber - anotherIP anotherPortNumber ][blablabla aNumber 10.70.4.127 bablabla - anotherIP 56390 anotherPortNumber - anotherIP anotherPortNumber ][blablabla aNumber 10.70.4.128 bablabla - anotherIP 56391 anotherPortNumber - anotherIP anotherPortNumber ]

对于行中的每个方括号,我需要使用正则表达式匹配第一个 IP 号和第一个端口号。

我的问题:是否有任何 RegEx 表示可以递归地从重复模式中提取列(在这种情况下,列将是 3 和 7,以空格作为分隔符)?

感谢任何建议

【问题讨论】:

  • 你试过什么?这似乎不需要特别复杂的正则表达式知识。此外,在处理正则表达式问题时,拥有准确的数据会非常有帮助,而不是“aNumber”和“anotherIP”。
  • 我看不出什么是递归的,你可以简单地做一个重复的模式。
  • 也许看看see awk command 是个好主意,特别是如果你只想按列号提取,试试这个cat logfile | awk '{print $3 $7}' 匹配ip 有很多很好的例子网络
  • @Jorge 我的回答对你有帮助吗?

标签: regex


【解决方案1】:

这是一个匹配所有 ip 和端口的正则表达式

正则表达式

((?:\d+\.){3}\d+)(?:.*?)(\d+)

测试字符串

2014 Jul 31 18:48:03 - - MYAPP - [blablabla aNumber 10.70.4.126 bablabla - anotherIP 56389 anotherPortNumber - anotherIP anotherPortNumber ]
2014 Jul 31 18:48:03 - - MYAPP - [blablabla aNumber 10.70.4.126 bablabla - anotherIP 56389 anotherPortNumber - anotherIP anotherPortNumber ][blablabla aNumber 10.70.4.127 bablabla - anotherIP 56390 anotherPortNumber - anotherIP anotherPortNumber ]
2014 Jul 31 18:48:03 - - MYAPP - [blablabla aNumber 10.70.4.126 bablabla - anotherIP 56389 anotherPortNumber - anotherIP anotherPortNumber ][blablabla aNumber 10.70.4.127 bablabla - anotherIP 56390 anotherPortNumber - anotherIP anotherPortNumber ][blablabla aNumber 10.70.4.128 bablabla - anotherIP 56391 anotherPortNumber - anotherIP anotherPortNumber ]

结果

第 1 场

  1. [52-63]10.70.4.126

  2. [85-90]56389

第 2 场

  1. [193-204]10.70.4.126

  2. [226-231]56389

第 3 场

  1. [300-311]10.70.4.127

  2. [333-338]56390

第 4 场

  1. [441-452]10.70.4.126

  2. [474-479] 56389

第 5 场

  1. [548-559]10.70.4.127

  2. [581-586]56390

第 6 场

  1. [655-666]10.70.4.128

  2. [688-693]56391

试试demo here

【讨论】:

    【解决方案2】:

    我不完全确定我是否理解您的需要,但在这里我发布此答案以提取 ip 和端口。使用这个正则表达式:

    \[.*?([\d\.]+).*?\-.*?(\d+).*?\]
    

    Working demo

    【讨论】:

      【解决方案3】:

      应该这样做:

      /(\[([^ ]+ ){2}([^ ])+ ([^ ]+ ){3}([^ ]+ )[^\]]+\])+/
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多