php - 如何从 Linux 上的日志文件中提取 XML block

标签 php regex linux perl command-line

我有一个如下所示的日志文件:

2010-05-12 12:23:45 Some sort of log entry
2010-05-12 01:45:12 Request XML: <RootTag>
<Element>Value</Element>
<Element>Another Value</Element>
</RootTag>
2010-05-12 01:45:32 Response XML: <ResponseRoot>
<Element>Value</Element>
</ResponseRoot>
2010-05-12 01:45:49 Another log entry

我想做的是提取请求和响应 XML(并最终将它们转储到它们自己的单个文件中)。我有一个使用 egrep 的类似解析器,但 XML 全部在一行上,而不是像上面那样多行。

日志文件也有些大,一个日志达到 500-600 兆。较小的日志我会通过 PHP 脚本读取并使用正则表达式匹配,但如此大的文件所需的内存量很可能会终止脚本。

是否有一种简单的方法使用 Linux 机器(在本例中为 CentOS)上的内置工具来提取多行,或者我是否必须硬着头皮使用 Perl 或 PHP 读取整个文件以提取出来?

最佳答案

# Example usage:
# perl script.pl data.xml RootTag > RootTag.xml

use strict;
use warnings;

my $tag = pop;

while (<>){
    if ( s/.*(<$tag>)/$1/ .. s/(<(\/)$tag>).*/$1/ ){
        print;
        last if $2;
    }
}

有关 flip-flop operator 的详细信息,请参阅文档.

关于php - 如何从 Linux 上的日志文件中提取 XML block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2831409/

相关文章:

使用 pthread 时,使用全局变量的 C++ 显示比指针慢 100%?

php - 将格式化的地址状态代码更改为 Woocommerce 订单中的状态名称

php - 正则表达式检查字符串是否有不匹配的括号?

php - 从服务器端向 Android 设备发送 FCM 消息

PHP 替换 HTML 标签以外的字符

java - 从 arm linux 上的 CMOS 相机读取流并将其转换为视频/照片

php - 在 PHP 中循环遍历 mysql_fetch_array

使用变音符号匹配单词边界的 JavaScript 正则表达式

java - 我如何更改 Ant grep 使其正则表达式中具有 unix 样式 "or"?

linux - 在手册页中使用 <> 来指示可选的空格