如何提取表格的所有文字&#34; <key> = <value>&#34;来自日志文件</value> </key>

时间:2014-07-17 01:12:35

标签: regex perl

您好,我需要从大型日志文件中提取表单文本 -

日志文件包含以下数据:

[accountNumber=0, email=tom.cruise@gmail.com, firstName=Tom, lastName= , message=Hello How are you doing today ?

我期望的输出是:

accountNumber=0
email=tom.cruise@gmail.com
firstName=Tom

有人可以帮忙吗?另外,请解释解决方案,以便我可以扩展它以满足我的类似需求。

4 个答案:

答案 0 :(得分:2)

我为此写了一个单行:

perl -nle 's/^\[//; for (split(/,/)){s/(?:^\s+|\s+$)//g; print}' input.txt

我还做了另一行输入来测试:

Matt@MattPC ~/perl/testing/13
$ cat input.txt
[accountNumber=0, email=tom.cruise@gmail.com, firstName=Tom, lastName= , message=Hello How are you doing today ?
[accountNumber=2, email=john.smith@gmail.com, firstName=John, lastName= , message=What is up with you?

这是输出:

Matt@MattPC ~/perl/testing/13
$ perl -nle 's/^\[//; for (split(/,/)){s/(?:^\s+|\s+$)//g; print}' input.txt
accountNumber=0
email=tom.cruise@gmail.com
firstName=Tom
lastName=
message=Hello How are you doing today ?
accountNumber=2
email=john.smith@gmail.com
firstName=John
lastName=
message=What is up with you?

说明:

扩展代码:

perl -nle '
           s/^\[//;
           for (split(/,/)){
                s/(?:^\s+|\s+$)//g;
                print
           }'
input.txt

逐行说明:

perl -nle使用命令行选项perl-n-l调用-e-n在程序周围添加while循环,如下所示:

 LINE:
while (<>) {
... # your program goes here
}

-l在每个print的末尾添加换行符。而-e指定的代码将使用单引号(')。

s/^\[//;会移除第一个[(如果有)。这将搜索并替换$_,它等于该行。

for (split(/,/)){开始for循环,循环遍历split(/,/)返回的数组。拆分将拆分$_,因为只用一个参数调用它,它将在,上拆分。 $_等于该行,但在for循环内,$_仍设置为我们所在数组的元素。

s/(?:^\s+|\s+$)//g;此行会删除前导和尾随空格。

print将打印$_后跟换行符,即换行符string=value

}'关闭for循环并完成'

input.txt为程序提供输入。

答案 1 :(得分:1)

关闭您的特定数据和所需的输出,您可以尝试以下方法:

use strict;
use warnings;

open my $fh, '<', 'file.txt' or die "Can't open file $!";
my $data = do { local $/; <$fh> };

my @matches = $data =~ /(\w+=\S+),/g;

print join "\n", @matches;

Working Demo

答案 2 :(得分:0)

Perl One-Liner

使用此:

perl -0777 -ne 'while(m/[^ ,=]+=[^,]*/g){print "$&\n";}' yourfile

答案 3 :(得分:0)

假设日志的每一行以结束方括号结尾,您可以使用:

#!/usr/bin/perl

use strict;
use warnings;

my $line = '[accountNumber=0, email=tom.cruise@gmail.com, firstName=Tom, lastName= , message=Hello How are you doing today ?]';

while($line =~ /([^][,\s][^],]*?)\s*[],]/g) {
    print $1 . "\n";
}