Як обмежити кількість результатів, повернених із grep?


180

Я хотів би сказати максимум 10 рядків від grep.

Я не хочу, щоб мій комп'ютер працював важко. Я хочу, щоб він припинився після 10 результатів, знайдених grep. Це можливо?


У вашому випадку ви не хочете, щоб комп'ютер працював важко. Але якщо це лише проблема з читабельністю людини, ви можете використовувати lessчерез трубу. Це заповнить екран, і ви можете натиснути ENTER, щоб побачити більше рядків і qвийти:grep "SomeText" somefile.csv | less
SilentSteel

Відповіді:


240

Можливо, -mваріант, який ви шукаєте:

grep -m 10 PATTERN [FILE]

Від 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.

Примітка: grep перестає читати файл, коли знайдено вказану кількість збігів!


3
привіт, я спробував це, в основному це працює, але це не здається, що греп "зупиняє" мислення після того, як він знайде перші 10 рядків, схоже, він продовжує думати і "використовувати мій процесор", і просто не друкує це правильно? thansk
Jas

6
@Jason: це, мабуть, не так: grep займає 0,005s з -m 1та 1,579s без файлу з 10 мільйонами рядків на моєму ноутбуці.
Grégoire

3
Трубопровід в tailзазвичай збирається на роботу, але зривається , особливо якщо ви з контекстом змісту, наприклад grep -A10 PATTERN, використовуючи tailобрізає контекст, а не кількість результатів. Ця відповідь була тим, що я шукав.
dimo414

1
-m 10- це варіант, який відрізняється під час отримання декількох файлів! У наступному файлі не буде показано збігів, якщо в першому файлі занадто багато збігів. Дякую !
Жульєн

1
IMHO це слід позначати як прийняту відповідь, оскільки для цього не потрібен інший інструмент. До речі, цей варіант простіше запам’ятати, коли дізнається, що це ярлик --max count
ishahak

68

Ще один варіант - просто використання голови :

grep ...parameters... yourfile | head

Для цього не знадобиться пошук у всьому файлі - він зупиниться, коли знайдеться перші десять відповідних рядків. Ще одна перевага цього підходу полягає в тому, що він поверне не більше 10 рядків, навіть якщо ви використовуєте grep з опцією -o.

Наприклад, якщо файл містить такі рядки:

112233
223344
123123

Тоді це різниця у виході:

$ grep -o '1.' ваш файл | голова -n2
11
12

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

Використовуючи headповернення лише 2 результати за бажанням, тоді як -m2 повертає 3.


3
Зверніть увагу , що ви не можете використовувати | headтрубку при використанні grepз -Aабо -B(і , таким чином , не тільки в пошуках результату ( -o), але для контексту, а). У такому випадку вам залишається -mсказати grep кількість рядків з результатами, які потрібно повернути.
Аттіла О.

17
Використання head насправді не зупиняє показ грепа через весь файл. Використання опції -m в грепі.
LopSae


0

Використання хвоста:

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

Ви можете встановити "Форматування коду", натиснувши піктограму типу "{}" у редакторі.
петерх

було б корисно забезпечити більш читаються приклади , ніж loooonl loooog liiines
Putnik

0

Для 2 випадків використання:

  1. Я хочу лише n загальних результатів, а не n результатів у файлі grep -m 2 максимум зустрічей у файлі.
  2. Я часто використовую те, git grepщо не приймає-m

Хорошою альтернативою в цих сценаріях є grep | sed 2qзібрання перших 2 подій у всіх файлах. sed документація: https://www.gnu.org/software/sed/manual/sed.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.