首页 > 解决方案 > 如何每行获得两个匹配项

问题描述

我需要一个词后PgTrx一个词Statusdescription

日志样本:

status=1&newMainBalance=5486&serviceAmount=700&ExternalTrxId=asdf&PgTrxId=tfpsadf&amount=0&statusDescription=Failed&customerCode=1.1&newDedicatedBalance=0&secureHash=56a7sdyf&paidAmount=1000&responseMsg=%a1%a1%A1(PG_ID)&language=enHTTP/1.1"200186243**1/1210669**1"-""-""-""https://example.com.eg?statusDescription=Failed&externalTrxId=123&status=203&secureHash=asdf&pgTrxId=asdf

我尝试了以下方法,但之后我只得到 1 个字statusdescription

perl -ne 'foreach my $p (split(/&/)) { if ($p =~ /statusDescription(=.*)/) { print "$1\n"; last } }'

cat file.txt | perl -ne 'forea ch my $p (split(/&/)) { if ($p =~ /statusDescription(=.*)/) { print "$1\n"; last } }'

我想得到如下结果。

PgTrxId=tfpsadf&statusDescription=Failed

但我只有

statusDescription=Failed

标签: perl

解决方案


不要与分裂有关。将整行解析为哈希,然后选择所需的键:

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

my @wanted = qw ( PgTrxId statusDescription );

while (<DATA>) {
   my %param = m/(\w+)=(\w+)/g;
   print Dumper \%param;

   print join ( "&", map { "$_:$param{$_}" } @wanted ),"\n";
}



__DATA__
status=1&newMainBalance=5486&serviceAmount=700&ExternalTrxId=asdf&PgTrxId=tfpsadf&amount=0&statusDescription=Failed&customerCode=1.1&newDedicatedBalance=0&secureHash=56a7sdyf&paidAmount=1000&responseMsg=%a1%a1%A1(PG_ID)&language=enHTTP/1.1"200186243**1/1210669**1"-""-""-""https://example.com.eg?statusDescription=Failed&externalTrxId=123&status=203&secureHash=asdf&pgTrxId=asdf

如果你想把它作为一个衬里:

perl -ne '%p = m/(\w+)=(\w+)/g; print join ( "&", map { "$_=$p{$_}" } ) qw ( PgTrxId statusDescription ),"\n"' 

为简洁起见,我在map这里使用它,因为这在单列中很有用,但在功能上等同于:

   my @list_of_wanted_things; 
   foreach my $word ( @wanted ) {
      push ( @list_of_wanted_things,  "$word=$param{$word}" ); 
   }
   print join "&", @list_of_wanted_things;

推荐阅读