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
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.
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
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
Cabeça canalizada para o grep leva você para o meio do caminho.
head -50 filename | grep string
Tags grep