Как я могу сохранить подсветку матча grep, когда трубопровод находит в 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" в указанных файлах, но вывод не имеет никакого выделения.

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

я запускаю Gnome Terminal 3.4.1.1 на Ubuntu 12.04, с bash в качестве моей оболочки.

28
задан Dennis
16.12.2022 5:36 Количество просмотров материала 3549
Распечатать страницу

2 ответа

в обоих командах, проблема в том, что не 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 in $FILE и посылает результаты напрямую на экране.

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

4
отвечен Dennis 2022-12-17 13:24

просто grep ваш выход снова, чтобы покрасить его.

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

3
отвечен Der Hochstapler 2022-12-17 15:41

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх