Perl正则表达式 - 每行提取两个部分

时间:2015-10-01 11:59:15

标签: regex perl shell

我试图从命令行使用Perl和regex从日志文件中提取信息:

cat file_1 | perl -ne 'print if s/(2015-09-..) .*for (.\d+,\d)/\1/'
2015-09-02 20:03:05,037 INFO  [ajp-bio-10.247.96.38-27032-exec-92] (RegisterOnlineAction:474) - REGISTRATION for [735078385,1]: Perform Action.
2015-09-02 20:26:41,383 INFO  [ajp-bio-10.247.96.39-27002-exec-66] (RegisterOnlineAction:474) - REGISTRATION for [724314312,1]: Perform Action.
2015-09-02 21:09:47,890 INFO  [ajp-bio-10.247.96.38-27002-exec-65] (RegisterOnlineAction:474) - REGISTRATION for [328057138,1]: Perform Bill.

但是我没有得到我需要的输出。

我需要的是:

2015-09-02 735078385,1
2015-09-02 724314312,1
2015-09-02 328057138,1

'打印如果s / text / text /'进行搜索和替换,可能不是最佳方式。但是有没有办法在每行中选择多个部分并将它们输出。

4 个答案:

答案 0 :(得分:1)

也匹配方括号:

 < file_1 perl -ne '/(2015-09-..).*for (\[[0-9,]+\])/ and print "$1 $2\n"'

答案 1 :(得分:0)

这是我的shell版本,使用 egrep awk &amp;的 TR

egrep '(2015-09-..) .*for (.[0-9]+,[0-9])' /tmp/xx | awk '{print $1,$9}' | tr -s '[]:' ' '

答案 2 :(得分:0)

分裂和转换怎么样?

#!/usr/bin/env perl 
use strict;
use warnings; 

while ( <> ) {
    my @stuff = split /,/;
    $stuff[2] =~ s/\].*//;
    print "$stuff[0],$stuff[2]";
}

或者,如果你只是在一行之后:

perl -ne 'print join ( ",", (map { s/\].*//g; $_ } split /,/)[0,2] );'

答案 3 :(得分:0)

你可以像这样使用oneliner并从命令行运行它:

perl -lnae '$F[8] =~ /(\d+,\d+)/ and print join " ", $F[0], $1' file.log  

1)key -n在输入文件(file.log)中的所有行上循环。

2)然后键-a按空格分割每一行,并将非空值放入@F数组。因此日期将在$F[0]和{&#34; [735078385]]中的值:&#34;将在$F[8]。我使用regexp /(\d+,\d+)/$F[8]中提取正确的值(不带方括号和冒号)并将其保存到$1变量中。