Греп только первый матч и остановка

Я искал каталог, рекурсивный, используя grep со следующими аргументами, надеясь вернуть только первое совпадение. К сожалению, он возвращает больше, чем два, в последний раз, когда я смотрел. Похоже, у меня слишком много аргументов, особенно без получения желаемого результата.: -/

# grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory

возвращает:

Pulsanti Operietur
Pulsanti Operietur

Может быть, grep - не лучший способ сделать это? Вы говорите мне, очень спасибо.

Ответ 1

-m 1 означает возврат первого совпадения в любом данном файле. Но он все равно продолжит поиск в других файлах. Кроме того, если есть две или более совпавших в одной строке, все они будут отображаться.

Вы можете использовать head -1 для решения этой проблемы:

grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -1

объяснение каждого варианта grep:

-o, --only-matching, print only the matched part of the line (instead of the entire line)
-a, --text, process a binary file as if it were text
-m 1, --max-count, stop reading a file after 1 matching line
-h, --no-filename, suppress the prefixing of file names on output
-r, --recursive, read all files under a directory recursively

Ответ 2

Вы можете передать результат grep в head в сочетании с stdbuf.

Обратите внимание, что для обеспечения остановки после N-го совпадения вам необходимо использовать stdbuf, чтобы убедиться, что grep не буферизирует его вывод:

stdbuf -oL grep -rl 'pattern' * | head -n1
stdbuf -oL grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -n1
stdbuf -oL grep -nH -m 1 -R "django.conf.urls.defaults" * | head -n1

Как только head потребляет 1 строку, она завершается, и grep получит SIGPIPE, потому что он все равно выводит что-то в трубку, пока head отсутствует.

Это предполагает, что имена файлов не содержат символа новой строки.

Ответ 3

Моя Grep-а-как программа ack имеет -1 вариант, который останавливается на первом матч найти в любом месте. Он поддерживает -m 1 который ссылается @mvp. Я поместил это туда, потому что, если я ищу большое дерево исходного кода, чтобы найти что-то, что, как я знаю, существует только в одном файле, нет необходимости его искать и нажимать Ctrl-C.

Ответ 4

Один вкладыш, используя find:

find -type f -exec grep -lm1 "PATTERN" {} \; -a -quit