如何使用regex从syslog消息中提取programname?我有一个java流处理模块,它接受regex来处理syslog消息。
日志行可以是:
2013-10-14T22:05:29+00:00 hostname sshd[6359]: Connection closed by 192.168.1.10
2013-10-14T22:05:29+00:00 hostname sshd:3322 Connection closed by 192.168.1.10
2013-10-14T22:05:29+00:00 hostname sshd/6359 Connection closed by 192.168.1.10
2013-10-14T22:05:29+00:00 hostname sshd Connection closed by 192.168.1.10
2013-10-14T22:05:29+00:00 hostname SSHD[1133] Connection closed by 192.168.1.10
2013-10-14T22:05:29+00:00 hostname SSH.D[6359]: Connection closed by 192.168.1.10
字符串提取过程应该是:取空格分隔的第三个子字符串,并提取以空格结尾的子字符串 [
, :
, /
或空间
所以在前四个日志样本中,提取的字符串 sshd
,第五个 SSHD
第六 SSH.D
. 用正则表达式可以吗?
编辑:
我试过的是 ((?:[A-Za-z][A-Za-z0-9_.-]+))
而且它似乎工作,但老实说,我修改了一个例子regex和使用一个在线工具来调整它,直到它适合我的用例,但我不知道它到底是如何工作的。
4条答案
按热度按时间yhived7q1#
双倍
split
应该做的工作:zlwx9yxi2#
我想你要找的正则表达式是:
package com.stackexchange.stackoverflow;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Question19370191 {
public static void main(String[] args) {
String regex = "([^\[:/]+).*";
Pattern pattern = Pattern.compile(regex);
}
Field "sshd[6359]: " Extraction "sshd"
Field "sshd:3322 " Extraction "sshd"
Field "sshd/6359 " Extraction "sshd"
Field "sshd " Extraction "sshd"
Field "SSHD[1133] " Extraction "SSHD"
Field "SSH.D[6359]:" Extraction "SSH.D"
fxnxkyjh3#
如果您的示例数据与您提供的完全相同:
解释:
(?:.+?\s){2}
…匹配到第二个空格([^\s[:/]+)
…匹配任何不是“”、“:”或“/”的项.+$
…匹配eol你想要的东西将在捕获组中
\1
gupuwyp24#
尝试以下操作:
还没测试过。