Intereting Posts
Предоставляет ли epoll доступные байты для чтения или записи и пороговую функцию? Как я могу отправить поддельные пакеты в Linux? Письмо Q перестало работать на клавиатуре i3 и vmware: как определить изменение разрешения и установить текущее разрешение на новое изменение смены? Проблема с трубами. Труба прекращается, когда читатель делает Debian offline dist-upgrade за один шаг поиск нескольких строк в нескольких файлах внутри каталога и печать строки и соответствующего имени файла, где она была найдена LXC: сбой systemd после 19-го контейнера DD-WRT: dhcp6c не получает новый адрес для ppp0 Пакет докеров не устанавливается из debian, но нормально с ubuntu Какова связь между ACPI, udev, HAL и pm-utils программа для ПК-телефона с использованием Gtalk? Как диагностировать и исправлять Arch Linux, не просыпаясь от спящего режима? Как отобразить всю строку сюжета в `mail`? Опция Awk inplace с оператором печати

Выход справки Grep

Хорошо, поэтому я использую grep на внешнем жестком диске

пример,

M:/ grep -rhI "bananas" . > out.txt 

который выводит любые строки внутри «М: /», содержащие «бананы»,

Однако я хотел бы вывести все содержимое файла, поэтому, если одна строка в файле example.txt содержит «бананы», выводит весь контент example.txt и тот же, что и для любого другого .txt-файла в каталоге «M: /», который содержит «бананы».

grep -r "bananas" | cut -d: -f1 | xargs cat >> result.txt

Grep

  • -r : рекурсивный. Прочитайте все файлы в каждом каталоге, рекурсивно,

Результат: file_name:text для каждой строки. Например, foo.txt:bananas .

Теперь нам нужно получить имя файла из каждой строки.

вырезать простой редактор, чтобы удалить часть строки (вы можете использовать sed или awk здесь, но разрез прост)

  • -d . Поскольку у нас есть : после файла это наш разделитель: -d:
  • -f мы разделили наш вывод на поля. Какой из них взять? -f1 – первый!

xargs

Теперь у нас есть список файлов. Что с ними делать? Мы используем xargs который строит и выполняет командные строки со стандартного ввода. Он принимает имя файла на stdin и запускает cat для каждой строки, предоставляя имя файла в качестве параметра. И cat просто печатает его содержимое в stdout.

>> означает «добавить в файл»

 grep -rlZI "bananas" . | xargs -0 cat > out.txt 

-lZ выводит нулевой список имен совпадающих файлов:

 -l, --files-with-matches Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning will stop on the first match. -Z, --null Output a zero byte (the ASCII NUL character) instead of the character that normally follows a file name. For example, grep -lZ outputs a zero byte after each file name instead of the usual newline. This option makes the output unambiguous, even in the presence of file names containing unusual characters like newlines. This option can be used with commands like find -print0, perl -0, sort -z, and xargs -0 to process arbitrary file names, even those that contain newline characters. 

Если ваша версия grep не предоставляет параметр -Z , тогда вы можете вернуться к простому -l который все равно будет обрабатывать имена файлов, содержащие пробелы (за исключением строк новой строки, очевидно), если вы также установите разделитель xargs в новую xargs :

 grep -rlI "bananas" . | xargs -d '\n' cat > out.txt