Как найти первое соответствие в нескольких файлах

Я использую этот сценарий от git/contrib с ударом. Это дает мне ответвление мерзавца и автозавершение также. состояние мерзавца может быть взломано в довольно легко также, от того, что я понимаю.

4
01.08.2013, 01:05
3 ответа

Просто используйте -m опция GNU grep который прекращает читать файл после (в примере) одно соответствие.

find dir -iname '*.ext' -exec grep -m 1  'pattern' {} \;
7
27.01.2020, 20:47
  • 1
    , из которого я хотел бы искать первое соответствие каждый из файлов, а не выйти после первого файла. –  gaberlunzie 01.08.2013, 00:49
  • 2
    Эта команда должна сделать просто это. Это продолжит искать каждый файл независимо от любого соответствия любого файла, которые находят, исследует. –  suspectus 01.08.2013, 01:09

Вы могли сделать это с awk сценарием:

find dir -iname '*.ext' -exec awk '/pattern/{print;exit}' {} \;
2
27.01.2020, 20:47
  • 1
    , который я попробовал - выход - должностное лицо (PDF) grep, но который только выходит после первого результата; я хотел бы искать несколько файлов первые соответствия. –  gaberlunzie 01.08.2013, 00:52
  • 2
    Почему Вы используете -quit? Это говорит find выходить после первого соответствия. –  Kevin 01.08.2013, 00:54
  • 3
    я все еще приобретаю навык grep и sed, а тем более для awk (который я не рассмотрел.) Ваше решение действительно работает (теперь только для добавления имен файлов, которые содержат соответствия, вид стиля pdfgrep.) –  gaberlunzie 01.08.2013, 01:08

Если ищущая команда не имеет никакого способа остановиться после первого соответствия, можно отфильтровать его результаты и сохранить только первую выходную строку: command 'pattern' /path/to/file | head -n 1. Команда получит сигнал SIGPIPE когда head выходы, таким образом, это могло бы продолжить искать еще несколько соответствий из-за буферизации, но это остановится до конца файла, если будет много соответствий.

Так как необходимо выполнить команду оболочки (для установки канала), необходимо вызвать sh от find. Следите за заключением в кавычки: Вам нужен один слой кавычек для внешней оболочки и другого для оболочки, запущенной find. Можно поместить одинарные кавычки вокруг команды внутренней оболочки и работы в одинарных кавычках с '\'' взлом (заканчивают литерал одинарной кавычки, \' для литеральной одинарной кавычки, и запускают новый литерал одинарной кавычки на одном дыхании), этот способ, которым Вам не нужно никакое другое заключение в кавычки в шаблоне (если шаблон не содержит a ' то, что Вы представили как '\'', в этом случае необходимо будет сделать это '\'\\\'\'').

find dir -iname '*.ext' -exec sh -c 'command '\''pattern'\'' "$0" | head -n 1' {} \;

Вместо того, чтобы волноваться о заключении в кавычки шаблона, можно поместить его снаружи и передать его в качестве параметра.

find dir -iname '*.ext' -exec sh -c 'command "$0" "$1" | head -n 1' 'pattern' {} \;

Это будет немного быстрее для вызова только одной оболочки и цикла по файлам.

find dir -iname '*.ext' -exec sh -c '
    for f; do command "$0" "$f" | head -n 1; done
' 'pattern' {} +
2
27.01.2020, 20:47

Теги

Похожие вопросы