Unix grep encontra o arquivo que começa com [pattern]

0

Eu gostaria de encontrar arquivos que comecem com um padrão específico, ou seja, a primeira linha do arquivo deve conter o padrão e, em seguida, imprimir as primeiras 10 linhas desse arquivo. Existe uma maneira de fazer isso?

Existe uma maneira de dizer ao grep para procurar apenas pela primeira linha do arquivo?

    
por Han_Chen 14.06.2015 / 21:42

3 respostas

2

Você precisaria digitalizar todos arquivos e obter a primeira linha, depois verificar o padrão, e finalmente executar uma impressão das dez primeiras linhas. Pode ficar muito caro.

find /path/to/search \
    -type f \
    -exec /bin/bash -c "head -n 1 '{}' | grep 'PATTERN' >/dev/null" \; \
    -exec head -n 10 \{\} \;

O -type f é necessário para não executar head nos diretórios e grep é redirecionado, pois estamos interessados apenas em seu status de saída. O segundo -exec será executado apenas nos arquivos que passarem no primeiro teste.

Recomenda-se que você adicione testes adicionais antes de -type f , para reduzir o número de arquivos que serão verificados.

    
por 14.06.2015 / 22:07
0

Se awk for uma opção, tente isto:

find . -type f -exec awk 'NR==1 && /PATTERN/ {x=1} NR>10 {exit} x' {} \;

Você pode ler o seguinte como:

If the first line match PATTERN then set x; if x is set then print the current line (implicit action); in either case exit after the 10th line.

Tecnicamente, a última condição deve ser !x || NR>10 para economizar alguns ciclos de CPU, mas a versão original parece melhor. :)

    
por 14.06.2015 / 23:26
0

Espero que isso seja útil.

grep -R -n "PATTERN" *.* | grep ":1:" | cut -d: -f1 | xargs head -n10

Isto irá procurar recursivamente por quaisquer arquivos, incluindo os subdiretórios e filtrar as primeiras linhas e depois imprimir as primeiras 10 linhas para esses arquivos.

    
por 15.06.2015 / 21:01

Tags