Grep primeiras 50 linhas de arquivos para padrão

5

Como um pode pesquisar as primeiras 50 linhas de arquivos em um diretório para uma determinada string ? Eu estou procurando especificamente quais arquivos de tabela de banco de dados (do mysqldump) definem um campo específico, mas eu não quero grep os arquivos inteiros, que depois de 20-40 linhas de CREATE TABLE continuam em centenas de instruções INSERT. p>

Eu poderia escrever um script Python para iterar nas primeiras linhas de cada arquivo, mas a experiência do Python, embora poderosa, é lenta. Eu tenho mais de 200 arquivos *. Sql para passar, e gostaria de aprender uma solução que eu poderia generalizar no futuro de qualquer maneira.

    
por dotancohen 22.04.2015 / 13:58

4 respostas

6

Esta solução funciona, mas sinto que é desajeitada. Pesquisando as primeiras 50 linhas da string "foobar":

$ for I in *.sql ; do echo $I && head -n 50 $I | grep foobar ; done
    
por 22.04.2015 / 14:00
10

awk (assumindo sua implementação suporta a declaração nextfile ) pode fazer isso muito bem:

awk 'FNR > 50 { nextfile }; /foobar/ { print FILENAME ": " $0 }' ./*.sql

A primeira instrução pula para o próximo arquivo depois que 50 registros foram processados. A segunda instrução imprime o nome do arquivo e a linha correspondente para qualquer linha contendo foobar .

Se o seu awk não tiver nextfile , esta variante também funciona, embora eu imagine que seja menos eficiente:

awk 'FNR <= 50 && /foobar/ { print FILENAME ": " $0 }' ./*.sql
    
por 22.04.2015 / 14:05
3

Na maneira de loop, o GNU sed também pode executar a tarefa:

for f in *.sql
do
    sed -e '1 F' -e '51 Q' -e '/pattern/! d' "$f"
done
    
por 22.04.2015 / 14:12
2

Cabeça canalizada para o grep leva você para o meio do caminho.

head -50 filename | grep string
    
por 22.04.2015 / 14:47

Tags