使用Java正则表达式从未用符号分隔的日志文件中查找主机名
我有一个日志文件,我的任务是找到状态为ERROR的日志文件的主机名。这是我的日志文件详细信息使用Java正则表达式从未用符号分隔的日志文件中查找主机名,java,Java,我有一个日志文件,我的任务是找到状态为ERROR的日志文件的主机名。这是我的日志文件详细信息 2017-02-09T02:37:44 [ERROR] Consumer iwjef99 could not be contacted 2017-02-09T02:37:46 [INFO] Message received from Producer w89fj93 2017-02-09T02:37:51 [ERROR] Consumer 7sjeuf returned 504 2017-02-09T0
2017-02-09T02:37:44 [ERROR] Consumer iwjef99 could not be contacted
2017-02-09T02:37:46 [INFO] Message received from Producer w89fj93
2017-02-09T02:37:51 [ERROR] Consumer 7sjeuf returned 504
2017-02-09T02:37:53 [INFO] Message received from Producer a99jef9
2017-02-09T02:37:59 [INFO] Message sent to Consumer a99jef9
2017-02-09T02:38:55 [ERROR] Consumer a99jef9 disconnected unexpectedly
对于第一个日志,状态为ERROR,主机名为iwjef99
。我已经尝试过使用这种方法来查找主机名
List<String> list = new ArrayList<String>();
File file = new File("C:\\Users\\Arif\\Desktop\\test.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
Pattern e = Pattern.compile(".*\\bERROR\\b.*");
Pattern h1 = Pattern.compile("([a-zA-Z]+?[0-9]+|[0-9]+?[a-zA-Z]+)");
String st;
while ((st = br.readLine()) != null) {
Matcher m = e.matcher(st);
if (m.find()) {
Matcher h = h1.matcher(st);
if (h.find()) {
list.add(h.group());
}
}
}
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
它捕获参数后的字符串并显示如下输出
09T
09T
09T
09T
List<String> list = new ArrayList<>();
File file = new File("logfile");
BufferedReader br = new BufferedReader(new FileReader(file));
Pattern e = Pattern.compile(".*\\[ERROR\\] [A-Za-z]+ ([A-Za-z0-9]+)");
String st;
while ((st = br.readLine()) != null) {
Matcher m = e.matcher(st);
if (m.find()) {
list.add(m.group(1));
}
}
for (String aList : list) {
System.out.println(aList);
}
但是我的欲望输出应该是这样的
iwjef99
7sjeuf
a99jef9
我如何才能做到这一点?不用正则表达式,可以使用String.Split实现目标,因为按“”空格字符拆分时,值显示在同一位置
if (st.Split(' ')[1] == "[ERROR]") list.add(st.Split(' ')[3])
不使用正则表达式,您可以使用String.Split实现目标,因为按“”空格字符拆分时,值显示在同一位置
if (st.Split(' ')[1] == "[ERROR]") list.add(st.Split(' ')[3])
我已经修改了这个正则表达式,现在应该是
Pattern e = Pattern.compile("\\[ERROR] [A-Za-z]+ ([\\w]+)");
我已经删除了您的第二个正则表达式,所以现在您的代码如下所示
09T
09T
09T
09T
List<String> list = new ArrayList<>();
File file = new File("logfile");
BufferedReader br = new BufferedReader(new FileReader(file));
Pattern e = Pattern.compile(".*\\[ERROR\\] [A-Za-z]+ ([A-Za-z0-9]+)");
String st;
while ((st = br.readLine()) != null) {
Matcher m = e.matcher(st);
if (m.find()) {
list.add(m.group(1));
}
}
for (String aList : list) {
System.out.println(aList);
}
我已经修改了这个正则表达式,现在应该是
Pattern e = Pattern.compile("\\[ERROR] [A-Za-z]+ ([\\w]+)");
我已经删除了您的第二个正则表达式,所以现在您的代码如下所示
09T
09T
09T
09T
List<String> list = new ArrayList<>();
File file = new File("logfile");
BufferedReader br = new BufferedReader(new FileReader(file));
Pattern e = Pattern.compile(".*\\[ERROR\\] [A-Za-z]+ ([A-Za-z0-9]+)");
String st;
while ((st = br.readLine()) != null) {
Matcher m = e.matcher(st);
if (m.find()) {
list.add(m.group(1));
}
}
for (String aList : list) {
System.out.println(aList);
}
你应该按空格分割,不要使用正则表达式,这样会省去一些麻烦
您应该按空格分割,不要使用正则表达式,这样可以省去一些麻烦。问题在于您的正则表达式,它找到09T是因为它与正则表达式匹配,我提出了以下正则表达式,它基于: 我已经从答案中删除了A-Z部分,因为您要匹配的字符串似乎只有小写。正则表达式将从以下位置匹配: 一个或多个数字字符,后跟一个或多个字母字符,后跟0个或多个字母数字字符 或 一个或多个字母字符,后跟一个或多个数字字符,后跟0个或多个字母数字字符
问题在于你的正则表达式,它找到了09T,因为它与正则表达式匹配,我提出了以下正则表达式,它基于: 我已经从答案中删除了A-Z部分,因为您要匹配的字符串似乎只有小写。正则表达式将从以下位置匹配: 一个或多个数字字符,后跟一个或多个字母字符,后跟0个或多个字母数字字符 或 一个或多个字母字符,后跟一个或多个数字字符,后跟0个或多个字母数字字符
如果错误日志行始终包含您可以使用的单词Consumer,则只需要匹配一个模式
Pattern p = Pattern.compile("\\[ERROR\\] Consumer ([\\w]*)");
服务器名称可以在组1中找到
Matcher m = p.matcher(st);
if (m.find()) {
String server = m.group(1);
}
如果[ERROR]后面的第一个单词可能不同
Pattern p = Pattern.compile("\\[ERROR\\] ([\\w]*) ([\\w]*)");
然后,第二个组包含服务器
Matcher m = p.matcher(st);
if (m.find()) {
String server = m.group(2);
}
如果错误日志行始终包含您可以使用的单词Consumer,则只需要匹配一个模式
Pattern p = Pattern.compile("\\[ERROR\\] Consumer ([\\w]*)");
服务器名称可以在组1中找到
Matcher m = p.matcher(st);
if (m.find()) {
String server = m.group(1);
}
如果[ERROR]后面的第一个单词可能不同
Pattern p = Pattern.compile("\\[ERROR\\] ([\\w]*) ([\\w]*)");
然后,第二个组包含服务器
Matcher m = p.matcher(st);
if (m.find()) {
String server = m.group(2);
}
好的,为什么你认为它输出的是09T而不是iwjef99,为什么当它试图满足第二个条件[a-zA-Z]+?[0-9]+|[0-9]+?[a-zA-Z]+时,输出的是iwjef99/,每次都是真的。但是我不知道如何逃脱。你的条件没有包括足够的主机名。您可以是abc123或123abc,但不能是99JEF9。我同意.split方法,因为空格是你的分隔符。好吧,为什么你认为它输出的是09T而不是iwjef99,为什么当它试图满足第二个条件[a-zA-Z]+?[0-9]+|[0-9]+?[a-zA-Z]时输出的是iwjef99/+它可以找到匹配的单词是否包含数字和字符,并且每次都是真的。但是我不知道如何逃脱。你的条件没有包括足够的主机名。您可以是abc123或123abc,但不能是99JEF9。我同意.split方法,因为空格是你的分隔符。你不提供答案吗?如果st.split'[1]==[ERROR]list.addst.split'[3]我提供了一个regex答案,以防OP想要使用regex:String.split使用字符串而不是字符,而不是',但是.equals.Souldn你不提供一个答案吗?如果st.Split'[1]==[ERROR]list.addst.Split'[3]我已经提供了一个正则表达式的答案,以防OP想要使用正则表达式:String.Split使用字符串而不是char,而不是'块几乎是\w。我不希望整个字符串都有错误,而只希望有主机名。顺便说一下,谢谢。这只是主机名。哦,我错了。我没注意到。谢谢,您的解决方案似乎是其中最好的:更新了我的regex,感谢@matt的建议\w:您的第二个[]块几乎是\w。我不希望整个字符串都有错误,而只需要主机名。顺便说一下,谢谢。这只是主机名。哦,我错了。我没注意到。谢谢,您的解决方案似乎是其中最好的:更新了我的正则表达式,感谢@mat
谢谢你的建议w:非常感谢。这正是我想要的。非常感谢。这正是我想要的。