Греп только первый матч и остановка
Я искал каталог, рекурсивный, используя 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