поиск и имена эхо-файлов только с найденным шаблоном

Я использовал это много, улучшение, которое я пытаюсь достичь, – избегать имен эхо-файлов, которые не совпадают с grep. Лучший способ сделать это?

for file in `find . -name "*.py"`; do echo $file; grep something $file; done 

6 Solutions collect form web for “поиск и имена эхо-файлов только с найденным шаблоном”

 find . -name '*.py' -exec grep something {} \; -print 

будет печатать имя файла после соответствующих строк.

 find . -name '*.py' -exec grep something /dev/null {} + 

будет печатать имя файла перед каждой соответствующей строкой (мы добавляем /dev/null для случая, когда есть только один соответствующий файл, так как grep не печатает имя файла, если ему передан только один файл для просмотра. grep имеет вариант -H для этого в качестве альтернативы).

 find . -name '*.py' -exec grep -l something {} + 

будет печатать только имена файлов файлов, имеющих хотя бы одну соответствующую строку.

Чтобы напечатать имя файла перед соответствующими строками, вместо этого вы можете использовать awk:

 find . -name '*.py' -exec awk ' FNR == 1 {filename_printed = 0} /something/ { if (!filename_printed) { print FILENAME filename_printed = 1 } print }' {} + 

Или дважды вызовите grep для каждого файла, хотя это было бы менее эффективно, так как он запускал хотя бы одну команду grep и до двух для каждого файла (и дважды читал содержимое файла):

 find . -name '*.py' -exec grep -l something {} \; \ -exec grep something {} \; 

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

Если вы хотите использовать цикл оболочки, с инструментами GNU:

 find . -name '*.py' -exec grep -l --null something {} + | xargs -r0 sh -c ' for file do printf "%s\n" "$file" grep something < "$file" done' sh {} + 

(также работает над FreeBSD и производными).

Если вы используете GNU grep, вы можете использовать его параметр -r или --recursive чтобы сделать эту простую находку для вас:

 grep -r --include '*.py' -le "$regexp" ./ # for filenames only grep -r --include '*.py' -He "$regexp" ./ # for filenames on each match 

Вам только нужно find если вам нужны более продвинутые предикаты.

Вы можете указать grep включить имя файла в вывод. Поэтому, если есть совпадение, оно будет показано на консоли; если в файле нет соответствия, для этого файла не будет напечатана строка.

 find . -name "*.py" | xargs grep -n -H something 

От man grep :

 -H Always print filename headers with output lines -n, --line-number Each output line is preceded by its relative line number in the file, starting at line 1. The line number counter is reset for each file processed. This option is ignored if -c, -L, -l, or -q is specified. 

Если ваши файлы могут иметь имена с пробелами в них, вам нужно переключить канал, чтобы использовать символы NUL в качестве разделителя. Теперь полная команда будет выглядеть так:

 find . -name "*.py" -print0 | xargs -0 grep -n -H something 

Вы можете попробовать что-то вроде:

 find . -name "*.py:" -exec grep -l {} \; 

Эта команда exec grep для каждого файла, обнаруженная командой find и ее стандартной функцией find find

Используйте аргумент -l .

 for file in `find . -name "*.py"`; do grep -l something $file && grep something $file; done 

Более широкое использование будет:

 for file in $(find . -name '*.py' -exec grep -l something '{}' +); do echo "$file"; grep something $file; done 

Существуют альтернативы grep которые по умолчанию выводят их результаты в нужном формате. 2 самых популярных из них, которые я знаю, это ag (он же «серебряный искатель») и ack . ag рекламируется как более быстрая альтернатива ack .

 $ ag '^\w+\s*\w+\(' ~/build/i3/src build/i3/src/display_version.c 58:void display_running_version(void) { build/i3/src/load_layout.c 42:static TAILQ_HEAD(focus_mappings_head, focus_mapping) focus_mappings = 518:json_content_t json_determine_content(const char *filename) { 575:void tree_append_json(Con *con, const char *filename, char **errormsg) { build/i3/src/xc 64:CIRCLEQ_HEAD(state_head, con_state) state_head = 67:CIRCLEQ_HEAD(old_state_head, con_state) old_state_head = 70:TAILQ_HEAD(initial_mapping_head, con_state) initial_mapping_head = 97:void x_con_init(Con *con, uint16_t depth) { ... 

Я не могу показать вам здесь, но результат аккуратно окрашен. Я получаю имена файлов в оливковом зеленом цвете, номера строк в желтом золоте, а в каждой строке – красный. Тем не менее, цвета настраиваются.

  • Символы, видимые в vi, но не в cat.
  • Печать строк после одного шаблона grep, пока не будет найден новый шаблон
  • Как использовать tail -f с grep для отображения окружающих линий
  • Греп, похоже, не работает должным образом для меня
  • Как я могу улучшить вывод find и grep?
  • Oneliner для определения переменных верблюда
  • Как игнорировать строки начинаются с # с помощью grep / awk
  • grep: найдите все строки, содержащие японские кандзи
  • Найдите шаблон, используя grep, а затем замените sed
  • Удаление строк из одного файла на основе небытия в другом
  • Как использовать greped url, предоставляемый tshark внутри сценария bash?
  • Interesting Posts

    Traceroute – где он заканчивается, когда пользователь SSHed?

    Установка ширины вкладки на выходе C ++ в bash

    Как показать количество установленных пакетов

    Вход Crontab с часовым диапазоном, проходящим в полночь

    как мне построить мост между двумя виртуальными машинами?

    Взаимосвязь с флажками маршрута с использованием маршрутов против флажков маршрута с использованием cat / proc / net / route

    Ошибка включенного зонда: syscall :: open_nocancel: entry): недопустимый доступ пользователя в действии №2 в DIF

    Изменить таблицу разделов с помощью GParted

    Как установить драйвер RTS5139 Card Reader для использования в Fedora 19

    Установщик Antergos говорит, что у меня нет / загрузочного раздела

    "Sec_error_unknown_issuer" в Iceweasel 22.0

    Где хранятся токены AFS и как их заставить запускать сеанс экрана

    Mutt не отправляет электронную почту при указании SMTP-сервера

    Невозможно выполнить двоичный файл в Mac OS X Lion 10.7.5

    Возможно ли открыть TCP-туннель в Linux в качестве специального символьного устройства?

    Linux и Unix - лучшая ОС в мире.