2015-10-01 3 views
1

Я пытаюсь извлечь информацию из лог-файлов с помощью Perl и регулярных выражений из командной строки:Perl регулярное выражение - извлечь две секции в каждой строке

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/текст/текст /» делает поиск и замену, и, вероятно, не лучший способ. Но есть ли способ выбрать несколько разделов на строку и получить их на выходе.

+0

Обновите свое регулярное выражение до '\ [(. \ D +, \ d) \]' для соответствия квадратных скобок. –

+0

это дает мне аналогичный выход как исходная команда: cat file_1 | perl -ne 'print if s/(2015-09- ..). * for \ [(. \ d +, \ d) \]/\ 1 /' 2015-09-02: выполнить действие. 2015-09-02: выполнить действие. 2015-09-02: Выполнить законопроект. – user3292147

ответ

1

Совпадение квадратные скобки, тоже:

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

Это он, чем вы очень – user3292147

0

Вот моя версия в оболочке с помощью задать расширенное, AWK & тр

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

вы можете использовать Oneliner, как это и запустить его из командной строки:

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

1) ключ -n делает цикл по всем строкам во входном файле (file.log).

2) тогда ключ -a разбивает каждую строку пробелами и помещает непустые значения в массив @F. поэтому даты будут в $F[0], а значения типа "[735078385,1]:" будут в $F[8]. Я использую regexp /(\d+,\d+)/, чтобы извлечь правильные значения от $F[8] (без квадратных скобок и двоеточия) и сохранить его в $1 переменной.