Grep todos os arquivos em um diretório e imprimir correspondências com o nome do arquivo

3

Eu tenho uma lista de arquivos de log que eu crio como parte de um script de codificação de vídeo que escrevi.

Eu gostaria de pesquisar todos eles e imprimir algumas estatísticas da codificação - o quão rápido elas foram codificadas, quais configurações foram usadas, etc.

Eu posso procurar o framerate médio em um arquivo através deste 1 liner:

cat ${filename} | grep average

quais saídas:

 work: average encoding speed for job is 23.211176 fps

e pesquise o fator de taxa:

cat ${filename} | grep RF

Eu gostaria de pesquisar todos os arquivos no diretório e imprimir um, ou de preferência os dois pedaços de informação junto com o nome do arquivo. Existe alguma maneira que eu possa usar find ou grep para obter isso em um one-liner, ou eu preciso escrever um script?

Eu gostaria de uma saída como esta:

/home/javanix/filename.log
    <RF line>
    <average line>

Eu gostaria que isso funcionasse usando o FreeBSD 9 ou o Ubuntu 12.04.

    
por javanix 25.06.2012 / 17:15

5 respostas

2

Usando awk com o formato de saída desejado:

awk '/average|RF/{ if(f!=FILENAME){f=FILENAME;print f} print"\t"$0}' *.log

Para pesquisa recursiva,

find path -name '*.log' -type f -exec \
  awk '/average|RF/{if(f!=FILENAME){f=FILENAME;print f}print"\t"$0}' {} \;
    
por 25.06.2012 / 17:40
3

Faça isso:

egrep 'RF|average' *

A saída não corresponderá à saída mostrada acima. Será assim:

filename1: ...
filename1: ...
filename2: ...
filename3: ...

Alguns nomes de arquivos aparecerão apenas uma vez e mais, dependendo de quantas correspondências houveram.

    
por 25.06.2012 / 17:20
3

Eu diria que você pode fazer isso apenas com o grep:

grep -srHE 'average|RF' path/

s para suprimir erros, r para recursivo, H para exibir o nome do arquivo e E (e o canal) para corresponder a qualquer dos dois padrões.

    
por 25.06.2012 / 17:23
0

Experimente este comando:

grep -P "average|RF" *

grep pesquisará todos os arquivos no diretório ( * ) e mostrará todas as correspondências para o uso de Regular compatível com Perl Expressão (PCRE) average|RF , que corresponde a ambos os average e RF .

O formato de saída será o seguinte:

filename.log:<RF line>
filename.log:<average line>
    
por 25.06.2012 / 17:21
0

Experimente este verso:

find -exec sh -c 'x=$(grep average "$0";grep RF "$0") && echo "$0\n$x"' {} \;

Produzirá:

<file 1>
<RF line>
<average line>
[...]

Como você pode ver, não há recuo para manter o código curto, uma alternativa seria colocar uma marca na linha do arquivo, algo como:

[...] echo ">>> $0\n$x"' {} \;
    
por 25.06.2012 / 18:26