Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过定义正则表达式筛选日志文件_Java_Regex_Linux_Logging_Grep - Fatal编程技术网

Java 通过定义正则表达式筛选日志文件

Java 通过定义正则表达式筛选日志文件,java,regex,linux,logging,grep,Java,Regex,Linux,Logging,Grep,我有一些巨大的日志文件(50Mb;~500K行),我需要开始从中过滤一些垃圾。日志文件是使用log4j生成的,其基本模式为: [log-level] date-time class etc, etc log-message 我正在寻找一种方法,我可以确定一个regex开始和regex结束(或类似的东西),将过滤出匹配的条目从文件中,所以我可以更容易地涉过这些庞大的文件。我的想法是,start regex将是日志级别,end regex将是日志消息中的某个内容。我相信我可以编写一个jav

我有一些巨大的日志文件(50Mb;~500K行),我需要开始从中过滤一些垃圾。日志文件是使用log4j生成的,其基本模式为:

[log-level] date-time class etc, etc  
log-message  
我正在寻找一种方法,我可以确定一个regex开始和regex结束(或类似的东西),将过滤出匹配的条目从文件中,所以我可以更容易地涉过这些庞大的文件。我的想法是,start regex将是日志级别,end regex将是日志消息中的某个内容。我相信我可以编写一个java程序来完成这项任务,但我想在走这条路之前,我会询问社区。提前谢谢


让我进一步阐述我的问题。假设我的日志文件中有以下代码段:

[DEBUG] date-time class etc, etc  
log-message-1

[WARN] date-time class etc, etc  
log-message-2

[DEBUG] date-time class etc, etc  
log-message-3

[DEBUG] date-time class etc, etc  
log-message-1

[WARN] date-time class etc, etc  
log-message-2

[DEBUG] date-time class etc, etc  
log-message-6
我想要一种过滤掉logEntry1和logEntry2的方法,因此我最终得到:

[DEBUG] date-time class etc, etc  
log-message-3

[DEBUG] date-time class etc, etc  
log-message-6
我希望通过定义一些正则表达式模式对来实现这一点。在上面的示例中,我想为logEntry1定义一对,为logEntry2定义另一对

我希望这有助于澄清我的问题。

(zyx:~)%echo$T
(zyx:~) % echo $T
[DEBUG] date-time class etc, etc  
log-message-1

[WARN] date-time class etc, etc  
log-message-2

[DEBUG] date-time class etc, etc  
log-message-3

[DEBUG] date-time class etc, etc  
log-message-1

[WARN] date-time class etc, etc  
log-message-2

[DEBUG] date-time class etc, etc  
log-message-6
(zyx:~) % echo $T | perl -e '$_=join("", <>); s/\[DEBUG\][^\n]*\n(log-message-1|log-message-2).*?(?=\n\[(DEBUG|WARN)\]|$)//sg; s/\[WARN\].*?(?=\n\[(DEBUG|WARN)\]|$)//sg; print;'


[DEBUG] date-time class etc, etc  
log-message-3



[DEBUG] date-time class etc, etc  
log-message-6
[调试]日期时间类等 日志消息-1 [警告]日期、时间、类别等 日志消息-2 [调试]日期时间类等 日志信息-3 [调试]日期时间类等 日志消息-1 [警告]日期、时间、类别等 日志消息-2 [调试]日期时间类等 日志消息-6 (zyx:~)%echo$T | perl-e'$\=join(“,”);s/\[DEBUG\][^\n]*\n(log-message-1 | log-message-2)。*?(?=\n\[(DEBUG | WARN)\]\124;$)/sg;s/\[WARN\].*(?=\n\[(调试|警告)\]\]\124$)/sg;打印 [调试]日期时间类等 日志信息-3 [调试]日期时间类等 日志消息-6
使用
awk
或awk样式的perl一行程序。

假设
log-message-1
log-message-2
和唯一模式

$ awk -vRS= '!/log-message-[12]/' ORS="\n\n" file
[DEBUG] date-time class etc, etc
log-message-3

[DEBUG] date-time class etc, etc
log-message-6

最好再加一个更具体的例子。[日志级别]的可能性是什么?如何判断日志消息行何时完成,另一项何时开始?帮助我们帮助你。闻起来像gawk或perl,但需要更多信息。日志级别值:DEBUG、info、WARN、ERROR、FATAL日志消息在遇到另一个日志级别时完成。请注意,50mb并不是那么大。是的,真正的问题始于1G:-)当然可以。。。假设我是awk或perl专家,我不知道这很容易学习。您需要一点awk来解析这些文件。perl可以在相同的awk样式中使用,语法简单。no-no-no。请不要在perl中使用
$创建多GB字符串(“,”)作者说他有50个MiB文件。如果他说大约2 GiB文件,我会写其他脚本。我不确定我是否理解这是在做什么。这并没有指定起始正则表达式。我确实注意到这删除了我日志中的所有空白行。我仍然不明白这是在做什么,但它似乎起作用了。我相信我可以接受这个片段,在文件中定义我的正则表达式集合,读取文件,循环执行每个片段的正则表达式,并且我应该在其中。命令将记录分隔符设置为空行,因此每个代码块从<代码> [.. ] /代码>到空白行被认为是1条记录。然后模式搜索不包含单词
log-message-1
log-message-2
的记录,并将其打印出来。就这些了。