Как ограничить количество результатов, возвращаемых из grep?

180

Я хотел бы сказать, 10 строк максимум от grep.

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

Jas
источник
В вашем случае вы не хотите, чтобы компьютер работал усердно ... Но если это просто проблема читабельности человека, вы можете использовать его по 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
Привет, он попробовал это, это в основном работает, но это не похоже на то, что grep «останавливается», думая, после того, как он находит первые 10 строк, похоже, что он продолжает думать и «используя мой процессор», и просто не печатать это правильно? Тханска
Jas
6
@Jason: похоже, это не так: grep занимает 0,005 с -m 1и 1,579 с без файла с 10 миллионами строк на моем ноутбуке.
Грегуар
3
Как tailправило, подключение работает, но оно не работает, особенно если вы разбираетесь с контекстом, например grep -A10 PATTERN, используете tailусеченный контекст, а не количество результатов. Этот ответ был тем, что я искал.
dimo414
1
-m 10это параметр, который имеет значение при подборе нескольких файлов! Трубопровод к заголовку не будет отображать совпадения в последующих файлах, если в первом файле слишком много совпадений. Спасибо !
Жюльен
1
ИМХО это следует пометить как принятый ответ, так как для этого не требуется другого инструмента. Кстати, эту опцию легче запомнить, зная, что это ярлык --max-count
ishahak 25.11.15
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 на самом деле не останавливает работу grep через весь файл. Использование опции -m в grep делает.
LopSae
7

Awk подход:

awk '/pattern/{print; count++; if (count==10) exit}' file
Каруми
источник
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$ 
Alex.gonzalez
источник
Вы можете установить «форматирование кода», щелкнув значок «{}» в редакторе.
Петер - Восстановить Монику
было бы полезно обеспечить более читаемые примеры , чем loooonl loooog liiines
Putnik
0

Для 2 вариантов использования:

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

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

Эмили
источник