Localizando a contagem de uma cadeia em vários arquivos compactados em vários diretórios (não agregados)

2

Estou tentando descobrir o número de linhas que contêm as strings "event" e "type". Os arquivos que eu quero pesquisar estão em várias pastas e são compactados. Consigo obter uma contagem agregada do que estou procurando, mas meu objetivo é ter a contagem exibida para cada arquivo. Isso é o que estou usando atualmente:

zcat /folder1/{folderA,folderB,folderC}/folder2/folder3/result-2018-05-1* | grep 'event' | grep 'type' | wc -l

E minha saída é:

86446

Mas quero que minha saída se pareça com:

result-2018-05-10.log.gz: 1000
result-2018-05-11.log.gz: 3000
result-2018-05-12.log.gz: 20000
result-2018-05-13.log.gz: 4446
result-2018-05-14.log.gz: 12000
result-2018-05-15.log.gz: 10000
result-2018-05-16.log.gz: 15000
result-2018-05-17.log.gz: 5000
result-2018-05-18.log.gz: 6000
result-2018-05-19.log.gz: 10000

Alguma sugestão?

    
por Sam 18.05.2018 / 22:27

1 resposta

1

Para apenas dois testes, isso deve ser suficiente:

zgrep -E -c 'event.*type|type.*event' /folder1/{folderA,folderB,folderC}/folder2/folder3/result-2018-05-1*

O teste se uma linha contiver type e event é o mesmo que testar se contiver type seguido mais tarde por event ou event seguido mais tarde por type . Isso não escalaria bem se um terceiro teste fosse necessário.

Em seguida, adicionar algo como | sed 's#^.*/##' deve fornecer o resultado exato na pergunta.

ATUALIZAÇÃO:

Para algo mais genérico, um loop parece melhor, então:

for i in /folder1/{folderA,folderB,folderC}/folder2/folder3/result-2018-05-1*; do
    printf '%s: ' "$(basename "$i")"
    zcat < "$i" | grep 'filter1' | grep 'filter 2' | grep 'filter3' | wc -l
done
    
por 18.05.2018 / 23:01