execute grep cmd recursivamente e imprima o nome do caminho e o resultado

1

Eu tenho um arquivo de log que existe em vários diretórios, um para cada cliente. Eu estou tentando executar o seguinte:

find . -iname "20140926.log" -exec cat {} \; | grep 123456 | grep 'food="100"' | wc -l

isso me retorna o resultado que eu quero, mas eu quero saber para cada fullpath qual era a contagem individual. Por exemplo eu tentei isso:

for f in "/path/*"; do
  result='eval grep 123456 "$f/logs/20140926.log" | grep 'food="100"' | wc -l'
  echo "$f - $result" 
done

Mas apenas retornando uma lista de todos os meus diretórios e depois o resultado final. Eu estou esperando algo assim:

/path1/log/file.log - 0
/path2/log/file.log - 2
/path3/log/file.log - 39
etc...

Desta forma eu posso ver o wc para o meu grep para cada caminho / arquivo

    
por Ptrkcon 26.09.2014 / 22:49

2 respostas

1

grep -H imprimirá nomes de arquivos para você, mas como você está realizando múltiplos greps, você pode simplesmente fazer o eco do nome do arquivo:

for f in $(find . -name '20140926.log'); do
    echo -n "$f "
    grep 123456 $f | grep -c 'food="100"'   # grep -c prints count of matches
done
    
por 26.09.2014 / 23:23
0

Você poderia fazer

find . -name 20140926.log | while read file; do 
    printf "%s - " "$file "; grep 123456 $file | grep -c 'food=100' 
done

Isso tem a vantagem de não quebrar nomes de arquivos com espaços. Ele quebra em novas linhas e barras invertidas, no entanto. Se seus arquivos podem ser completamente irracionais, use isto:

find . -name 20140926.log | while read -rd '' file; do 
    printf "%s - " "$file "; grep 123456 "$file" | grep -c 'food=100'      
done
    
por 27.09.2014 / 05:35