Como limite o número de resultados retornados do grep?

180

Eu gostaria de dizer 10 linhas no máximo do grep.

Não quero que meu computador trabalhe duro. Quero que pare após 10 resultados encontrados pelo grep. É possível?

Jas
fonte
No seu caso, você não deseja que o computador trabalhe duro. Mas se for apenas um problema de legibilidade humana, você pode usá less- lo através de um cano. Isso irá preencher a tela e você pode pressionar ENTER para ver mais linhas e qsair:grep "SomeText" somefile.csv | less
SilentSteel

Respostas:

240

A -mopção é provavelmente o que você está procurando:

grep -m 10 PATTERN [FILE]

De man grep:

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the  input  is
        standard  input  from a regular file, and NUM matching lines are
        output, grep ensures that the standard input  is  positioned  to
        just  after the last matching line before exiting, regardless of
        the presence of trailing context lines.  This enables a  calling
        process  to resume a search.

Nota: grep para de ler o arquivo assim que o número especificado de correspondências for encontrado!

Erik Pilz
fonte
3
oi, tentei, funciona basicamente, mas não parece que o grep "pare" de pensar depois que ele encontrar as 10 primeiras linhas, parece que ele continua pensando e "usando minha CPU" e simplesmente não imprime, está correto? thansk
Jas
6
@ Jason: esse não parece ser o caso: o grep leva 0,005s com -m 1e 1,579s sem em um arquivo com 10 milhões de linhas no meu laptop.
18713 Grégoire
3
A penetração tailgeralmente funciona, mas é interrompida principalmente se você estiver cumprindo o contexto, por exemplo grep -A10 PATTERN, usando tailtrunca o contexto, em vez do número de resultados. Esta resposta foi o que eu estava procurando.
dimo414
1
-m 10é a opção que faz a diferença ao receber vários arquivos! A tubulação na cabeça não mostrará correspondências nos arquivos subseqüentes se houver muitas correspondências no primeiro arquivo. Obrigado !
Julien
1
IMHO isso deve ser marcado como a resposta aceita, pois não requer outra ferramenta. BTW, é mais fácil de lembrar esta opção quando sabendo que é o atalho de --max-count
ishahak
68

Outra opção é apenas usar head :

grep ...parameters... yourfile | head

Isso não exigirá a pesquisa do arquivo inteiro - ele será interrompido quando as dez primeiras linhas correspondentes forem encontradas. Outra vantagem dessa abordagem é que ela retornará não mais que 10 linhas, mesmo se você estiver usando grep com a opção -o.

Por exemplo, se o arquivo contiver as seguintes linhas:

112233
223344
123123

Então esta é a diferença na saída:

$ grep -o '1.' yourfile | cabeça -n2
11
12

$ grep -m2 -o '1.'
11
12
12

Usar headretorna apenas 2 resultados, conforme desejado, enquanto -m2 retorna 3.

Mark Byers
fonte
3
Observe que você não pode usar o | headcanal ao usar grepcom -Aou -B(e, portanto, não apenas pesquisando resultado ( -o), mas também contexto). Nesse caso, você -mdeve informar ao grep o número de linhas com resultados a serem retornados.
Attila O.
17
Usar head não impede que o grep seja executado em todo o arquivo. Usar a opção -m no grep faz.
LopSae 9/04
7

Abordagem awk:

awk '/pattern/{print; count++; if (count==10) exit}' file
Kurumi
fonte
0

Usando cauda:

#dmesg 
...
...
...
[132059.017752] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
[132116.566238] cfg80211: Calling CRDA to update world regulatory domain
[132116.568939] cfg80211: World regulatory domain updated:
[132116.568942] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132116.568944] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568945] cfg80211:   (2457000 KHz - 2482000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568947] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
[132116.568948] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132116.568949] cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[132120.288218] cfg80211: Calling CRDA for country: GB
[132120.291143] cfg80211: Regulatory domain changed to country: GB
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | head 2
head: cannot open 2 for reading: No such file or directory
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -2
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -5
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ dmesg | grep cfg8021 | tail -6
[132120.291146] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[132120.291148] cfg80211:   (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291150] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291152] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (N/A, 2000 mBm)
[132120.291153] cfg80211:   (5490000 KHz - 5710000 KHz @ 40000 KHz), (N/A, 2700 mBm)
[132120.291155] cfg80211:   (57240000 KHz - 65880000 KHz @ 2160000 KHz), (N/A, 4000 mBm)
alex@ubuntu:~/bugs/navencrypt/dev-tools$ 
Alex.gonzalez
fonte
Você pode definir "formatação de código" clicando no ícone como "{}" no editor.
peterh - Restabelece Monica
que seria útil fornecer exemplos mais legíveis do que liiines loooog loooonl
Putnik
0

Para 2 casos de uso:

  1. Eu só quero n resultados gerais, não n resultados por arquivo, grep -m 2é a ocorrência máxima por arquivo.
  2. Eu costumo usar o git grepque não leva-m

Uma boa alternativa nesses cenários é grep | sed 2qgrep 2 primeiras ocorrências em todos os arquivos. documentação sed: https://www.gnu.org/software/sed/manual/sed.html

Emily
fonte