Jak ograniczyć liczbę wyników zwracanych przez grep?

180

Chciałbym powiedzieć, że maksymalnie 10 wierszy z grepa.

Nie chcę, żeby mój komputer ciężko pracował. Chcę, żeby się zatrzymało po 10 wynikach znalezionych przez grep. Czy to możliwe?

Jas
źródło
W twoim przypadku nie chcesz, aby komputer ciężko pracował .. Ale jeśli jest to tylko problem z czytelnością dla człowieka, możesz użyć lesspotoku. To wypełni ekran i możesz nacisnąć ENTER, aby zobaczyć więcej linii i qwyjść:grep "SomeText" somefile.csv | less
SilentSteel

Odpowiedzi:

240

Ta -mopcja jest prawdopodobnie tym, czego szukasz:

grep -m 10 PATTERN [FILE]

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

Uwaga: grep przestaje czytać plik po znalezieniu określonej liczby dopasowań!

Erik Pilz
źródło
3
Cześć, wypróbowałem to w zasadzie działa, ale nie wygląda na to, że grep „przestaje” myśleć po znalezieniu pierwszych 10 linii, wygląda na to, że kontynuuje myślenie i „używa mojego procesora” i po prostu nie drukuje, czy to jest poprawne? thansk
Jas
6
@Jason: wydaje się, że tak nie jest: grep zajmuje 0,005 s -m 1zi 1,579 s bez w pliku z 10 milionami wierszy na moim laptopie.
Grégoire
3
Piping do na tailogół zadziała, ale psuje się szczególnie, jeśli grepujesz z kontekstem, np. grep -A10 PATTERNUżycie tailobcina kontekst, a nie liczbę wyników. Ta odpowiedź była tym, czego szukałem.
dimo414
1
-m 10jest opcją, która robi różnicę podczas grepowania wielu plików! Piping to head nie pokaże dopasowań w kolejnych plikach, jeśli jest zbyt wiele dopasowań w pierwszym pliku. Dzięki !
Julien
1
IMHO to powinno być oznaczone jako zaakceptowana odpowiedź, ponieważ nie wymaga innego narzędzia. BTW, łatwiej zapamiętać tę opcję, wiedząc, że jest to skrót do --max-count
ishahak
68

Inną opcją jest po prostu użycie głowy :

grep ...parameters... yourfile | head

Nie będzie to wymagało przeszukiwania całego pliku - zatrzyma się po znalezieniu pierwszych dziesięciu pasujących wierszy. Kolejną zaletą tego podejścia jest to, że zwraca nie więcej niż 10 wierszy, nawet jeśli używasz grep z opcją -o.

Na przykład, jeśli plik zawiera następujące wiersze:

112233
223344
123123

To jest różnica w wydajności:

$ grep -o '1.' twój plik | głowa -n2
11
12

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

Użycie headzwraca tylko 2 wyniki zgodnie z potrzebami, natomiast -m2 zwraca 3.

Mark Byers
źródło
3
Zwróć uwagę, że nie możesz używać | headpotoku podczas używania grepwith -Aor -B(a więc nie tylko wyszukiwania wyniku ( -o), ale także kontekstu). W takim przypadku pozostaje -mci powiedzieć grepowi liczbę wierszy z wynikami do zwrócenia.
Attila O.
17
Używanie head w rzeczywistości nie powstrzymuje grepa przed uruchomieniem całego pliku. Użycie opcji -m w grep działa.
LopSae
7

Podejście Awk:

awk '/pattern/{print; count++; if (count==10) exit}' file
kurumi
źródło
0

Za pomocą ogona:

#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
źródło
Możesz ustawić „formatowanie kodu”, klikając ikonę „{}” w edytorze.
peterh - Przywróć Monikę
przydałoby się podać bardziej czytelne przykłady niż loooonl loooog liiines
Putnik
0

W 2 przypadkach użycia:

  1. Chcę tylko n ogólnych wyników, a nie n wyników na plik, grep -m 2maksymalna liczba wystąpień jest na plik.
  2. Często używam tego, git grepco nie bierze-m

Dobrą alternatywą w tych scenariuszach jest grep | sed 2qgrep pierwsze 2 wystąpienia we wszystkich plikach. dokumentacja sed: https://www.gnu.org/software/sed/manual/sed.html

Emilia
źródło