Filtragem eficiente de muitos arquivos pelo seu conteúdo com awk / sed / grep

0

Eu quero listar todos os arquivos dentro de um diretório (recursivamente) que tenham suas segundas linhas totalmente correspondentes a uma determinada expressão regular. O número total de arquivos é de aproximadamente 60K.

Até agora, compus este comando: find /path -type f | xargs --no-run-if-empty -n1000 awk 'FNR = 2 && $0 ~ /^regular expression$/ {print FILENAME; nextfile}' .

Pode ser mais eficiente?

    
por Alexander Mashin 05.02.2017 / 06:56

2 respostas

2

Primeiro, tenha em atenção que, por engano, usou = em vez do == correto.

Você não precisa de xargs , pode executar diretamente de find . Além disso, o awk deve sair assim que processar a linha 2, em vez de ler todo o arquivo.

find /path -type f -exec awk 'FNR == 2 && /^regular expression$/ {print FILENAME}; FNR == 2 {nextfile}' '{}' +

O + no final do argumento -exec instrui find a colocar quantos argumentos de nome de arquivo forem possíveis. À-la xargs . Consulte a documentação find .

O ponto importante aqui é FNR==2 {nextfile} .

Se -exec é melhor que xargs (mas use -print0 & -0 , se disponível) está sujeito a discussões. Por um lado, find … | xargs … permite alguma paralelização com find lendo mais alguns nomes de arquivos, enquanto awk inspeciona um lote anterior. Por outro lado, a paralelização pode resultar em lixo ruim com awk e find competindo por diferentes faixas do disco. Seu hardware (tamanho do cache, SSD, etc.) mudará o acordo. O perfil decide então.

    
por 05.02.2017 / 09:02
0

Você pode tentar:

grep -n <reg expr> /path/to/* | grep ":2:" | cut -d ':' -f1

Contanto que :2: não faça parte do <reg expr> .

Há também -x para correspondência de linhas inteiras.

Não faço ideia se isso é mais rápido - não tenho 60k para testar:]

    
por 05.02.2017 / 08:02

Tags