我试图从命令行使用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 /'进行搜索和替换,可能不是最佳方式。但是有没有办法在每行中选择多个部分并将它们输出。
答案 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
变量中。