Awk / grep / sed obtém uma lista de números separados por vírgulas das linhas de texto

1

Eu tenho um arquivo de log que tem linhas parecidas com esta:

blah blah blah Photo for (702049679 - blah blah blah

Agora sei que posso obter todas as linhas do arquivo fazendo isso:

grep "Photo for" logFile

Mas como posso pegar essas linhas e obter uma lista separada por vírgulas de cada número após os parênteses em uma única linha de saída (elas serão coladas em uma consulta SQL)?

Os números em questão serão a primeira ocorrência de uma sequência de caracteres numéricos com 9 ou mais dígitos. Idealmente, poderia ser correspondido usando esse critério, ou o critério do primeiro número que ocorre após a "Foto para (" texto.

    
por Muhd 31.01.2014 / 01:20

3 respostas

1

Um regex este complicado é melhor tratado com Perl, por exemplo

grep "Photo for" logFile | perl -pe 's/.*Photo for ((\d+).*//' | tr '\n' ','

Se o Perl estiver fora de questão:

grep "Photo for" logFile | awk '{sub(/.*Photo for \(/,"",$0);sub(/[ ].*/,"");print $0}' | tr '\n' ','
    
por 31.01.2014 / 01:39
2

Uma alternativa que usa apenas Perl e corresponde aos critérios que você especificou:

perl -ne '
    /Photo for/ && /([0-9]{9,})/ && push @numbers,$1;
    END{ $" = ","; print "@numbers" }
' logFile

Isso imprimirá uma lista separada por vírgula da primeira ocorrência de uma sequência de dígitos contígua composta de 9 ou mais dígitos em cada linha correspondente a Photo for .

    
por 31.01.2014 / 02:53
0

1) precisa do gnu grep

grep -iPo "(?<=Photo for \()[0-9]+" logFile|tr "\n" ","

2) Usando o awk

awk -F \( '/Photo for/{split($2,a,OFS);printf a[1] ","}' logFile
    
por 31.01.2014 / 05:45