4

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

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

Или это:

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

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

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

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

2 ответа2

4

Проблема в обеих командах заключается в том, что не 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 устанавливает для внутреннего разделителя полей значение по умолчанию (не требуется в скрипте).

3

Просто grep ваш вывод еще раз, чтобы раскрасить его.

Я сделал нечто подобное здесь: получить дополнительные данные о совпадении от grep

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .