Как сохранить подсветку совпадений grep при передаче find в grep?

Как сохранить подсветку совпадений grep при передаче find в grep?

Если я запускаю grep foo bar.txt, grep выделяет каждое вхождение "foo" в bar.txt. Но иногда мне нужно использовать его findдля определения того, какие файлы ищет grep. Поэтому я делаю что-то вроде этого:

find . -iname "*.abc" | xargs grep foo

Или это:

find . -iname "*.abc" -exec grep foo {} \;

В обоих случаях grep правильно находит вхождения «foo» в указанных файлах, но вывод не имеет никакой подсветки.

Как мне продолжить использовать findgrep для выбора файлов для поиска, не теряя при этом подсветку?

Я использую Gnome Terminal 3.4.1.1 на Ubuntu 12.04 с bash в качестве оболочки.

решение1

В обеих командах проблема заключается в том, что не сама grepкоманда, а другая команда генерирует фактический вывод ( xargsи find, соответственно).

Эту проблему можно решить, напрямую вызвав grepимя каждого файла:

IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
    grep foo $FILE
done
unset IFS

Или в одной строке:

IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS

Как это работает:

  • IFS=$'\n'устанавливает внутренний разделитель полей на символ новой строки (иначе пробелы в именах файлов вызовут проблемы).

  • for FILE in $(COMMAND); do COMMANDS doneперебирает файлы, указанные в COMMAND, устанавливает переменную FILEв текущий файл и выполняет COMMANDS.

  • grep foo $FILEищет и fooотправляет $FILEрезультатынапрямуюна экран.

  • unset IFSвозвращает внутренний разделитель полей к значению по умолчанию (не требуется в скрипте).

решение2

Просто grepснова раскрасьте ваш вывод.

Я сделал что-то похожее здесь:Получить дополнительные данные о совпадении с помощью grep

Связанный контент