Wie beschränke ich die Anzahl der von grep zurückgegebenen Ergebnisse?

180

Ich möchte maximal 10 Zeilen von grep sagen.

Ich möchte nicht, dass mein Computer hart arbeitet. Ich möchte, dass es nach 10 von grep gefundenen Ergebnissen aufhört. Ist es möglich?

Jas
quelle
In Ihrem Fall möchten Sie nicht, dass der Computer hart arbeitet. Wenn es sich jedoch nur um ein Problem der menschlichen Lesbarkeit handelt, können Sie ihn lessüber eine Pipe verwenden. Das wird den Bildschirm füllen und Sie können ENTER qgrep "SomeText" somefile.csv | less
drücken

Antworten:

240

Die -mOption ist wahrscheinlich das, wonach Sie suchen:

grep -m 10 PATTERN [FILE]

Von 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.

Hinweis: grep hört auf, die Datei zu lesen, sobald die angegebene Anzahl von Übereinstimmungen gefunden wurde!

Erik Pilz
quelle
3
Hallo, es hat versucht, es funktioniert im Grunde, aber es scheint nicht so, als ob der Grep "aufhört" zu denken, nachdem er die ersten 10 Zeilen gefunden hat. Es sieht so aus, als würde er weiter denken und "meine CPU verwenden" und nur nicht drucken. Ist es richtig? thansk
Jas
6
@ Jason: Dies scheint nicht der Fall zu sein: grep benötigt 0,005 s mit -m 1und 1,579 s ohne in einer Datei mit 10 Millionen Zeilen auf meinem Laptop.
Grégoire
3
Rohrleitungen in tailist in der Regel an die Arbeit gehen, aber bricht vor allem , wenn Sie mit Kontext sind greppen, zum Beispiel grep -A10 PATTERNunter Verwendung von tailVerkürzungen den Kontext, anstatt die Anzahl der Ergebnisse. Diese Antwort war das, wonach ich gesucht habe.
dimo414
1
-m 10ist die Option, die den Unterschied macht, wenn mehrere Dateien erfasst werden! Piping to Head zeigt keine Übereinstimmungen in nachfolgenden Dateien an, wenn die erste Datei zu viele Übereinstimmungen enthält. Vielen Dank !
Julien
1
IMHO sollte dies als akzeptierte Antwort markiert werden, da kein anderes Tool erforderlich ist. Übrigens ist es einfacher, sich an diese Option zu erinnern, wenn man weiß, dass es sich um die Abkürzung von --max-count
ishahak vom
68

Eine andere Option ist nur die Verwendung von head :

grep ...parameters... yourfile | head

Dies erfordert nicht das Durchsuchen der gesamten Datei - es wird gestoppt, wenn die ersten zehn übereinstimmenden Zeilen gefunden werden. Ein weiterer Vorteil dieses Ansatzes besteht darin, dass nicht mehr als 10 Zeilen zurückgegeben werden, selbst wenn Sie grep mit der Option -o verwenden.

Zum Beispiel, wenn die Datei die folgenden Zeilen enthält:

112233
223344
123123

Dann ist dies der Unterschied in der Ausgabe:

$ grep -o '1.' Ihre Datei | Kopf -n2
11
12

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

Bei Verwendung werden headwie gewünscht nur 2 Ergebnisse zurückgegeben, während bei -m2 3 zurückgegeben wird.

Mark Byers
quelle
3
Beachten Sie, dass Sie die | headPipe nicht verwenden können , wenn Sie grepmit -Aoder verwenden -B(und daher nicht nur nach result ( -o) suchen , sondern auch nach Kontext). In diesem Fall müssen Sie -mgrep die Anzahl der Zeilen mit den zurückzugebenden Ergebnissen mitteilen.
Attila O.
17
Die Verwendung von head verhindert nicht, dass grep die gesamte Datei durchläuft. Die Verwendung der Option -m in grep funktioniert.
LopSae
7

Awk Ansatz:

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

Schwanz benutzen:

#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
quelle
Sie können die "Code-Formatierung" einstellen, indem Sie im Editor auf das Symbol "{}" klicken.
Peterh - Wiedereinsetzung Monica
Es wäre nützlich, besser lesbare Beispiele zu liefern als loooonl loooog liiines
Putnik
0

Für 2 Anwendungsfälle:

  1. Ich möchte nur n Gesamtergebnisse, nicht n Ergebnisse pro Datei, sondern das grep -m 2maximale Vorkommen pro Datei.
  2. Ich benutze oft git grepwas nicht dauert-m

Eine gute Alternative in diesen Szenarien besteht darin grep | sed 2q, die ersten beiden Vorkommen in allen Dateien zu erfassen. sed Dokumentation: https://www.gnu.org/software/sed/manual/sed.html

Emily
quelle