Come posso limitare il numero di risultati restituiti da grep?


180

Vorrei dire 10 righe al massimo da grep.

Non voglio che il mio computer lavori duro. Voglio che si fermi dopo 10 risultati trovati da grep. È possibile?


Nel tuo caso non vuoi che il computer lavori duro .. Ma se è solo un problema di leggibilità umana, puoi usarlo lesstramite una pipe. Questo riempirà lo schermo e puoi premere INVIO per vedere più righe e qper uscire:grep "SomeText" somefile.csv | less
SilentSteel

Risposte:


240

L' -mopzione è probabilmente quello che stai cercando:

grep -m 10 PATTERN [FILE]

Da 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 smette di leggere il file una volta trovato il numero specificato di corrispondenze!


3
ciao ci ha provato funziona fondamentalmente ma non sembra che il grep "smetta" di pensare dopo aver trovato le prime 10 righe sembra che continui a pensare e "usando la mia cpu" e semplicemente non stampare è corretto? grazie
Jas

6
@Jason: questo non sembra essere il caso: grep richiede 0.005s -m 1e 1.579s senza un file con 10 milioni di righe sul mio laptop.
Grégoire,

3
Il piping in tailgeneralmente funzionerà, ma si interrompe in particolare se si attacca con il contesto, ad esempio grep -A10 PATTERN, usando tailtronca il contesto, piuttosto che il numero di risultati. Questa risposta era quello che stavo cercando.
dimo414,

1
-m 10è l'opzione che fa la differenza quando si esegue il grepping di più file! Il piping all'head non mostrerà le corrispondenze nei file successivi se ci sono troppe corrispondenze nel primo file. Grazie !
Julien,

1
IMHO questo dovrebbe essere contrassegnato come la risposta accettata, in quanto non richiede un altro strumento. A proposito, è più facile ricordare questa opzione quando si sa che è la scorciatoia di --max-count
ishahak

68

Un'altra opzione è solo usando la testa :

grep ...parameters... yourfile | head

Ciò non richiederà la ricerca dell'intero file: si interromperà quando vengono trovate le prime dieci righe corrispondenti. Un altro vantaggio di questo approccio è che non restituirà più di 10 righe anche se si utilizza grep con l'opzione -o.

Ad esempio se il file contiene le seguenti righe:

112233
223344
123123

Quindi questa è la differenza nell'output:

$ grep -o '1.' yourfile | testa -n2
11
12

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

L'uso headrestituisce solo 2 risultati come desiderato, mentre -m2 restituisce 3.


3
Si noti che non è possibile utilizzare la | headpipe quando si utilizza grepcon -Ao -B(e quindi non solo la ricerca di result ( -o), ma anche del contesto). In tal caso, ti resta -mda comunicare a grep il numero di righe con i risultati da restituire.
Attila O.

17
L'uso di head in realtà non interrompe l'esecuzione di grep attraverso l'intero file. Usare l'opzione -m in grep lo fa.
LopSae,

7

Approccio Awk:

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

0

Usando la coda:

#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$ 

Puoi impostare la "formattazione del codice" facendo clic sull'icona come "{}" nell'editor.
Peter - Ripristina Monica l'

sarebbe utile fornire esempi più leggibili di loooonl loooog liiines
Putnik

0

Per 2 casi d'uso:

  1. Voglio solo n risultati complessivi, non n risultati per file, grep -m 2è la ricorrenza massima per file.
  2. Uso spesso git grepciò che non richiede-m

Una buona alternativa in questi scenari è grep | sed 2qgrep prime 2 occorrenze su tutti i file. documentazione sed: https://www.gnu.org/software/sed/manual/sed.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.