您好,我需要从大型日志文件中提取表单文本 -
日志文件包含以下数据:
[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
等
有人可以帮忙吗?另外,请解释解决方案,以便我可以扩展它以满足我的类似需求。
答案 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;
答案 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";
}