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

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

пример,

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

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

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

2 Solutions collect form web for “Выход справки Grep”

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 
  • Фильтрация результатов grep с помощью путей, содержащих папку1 / folder2, и обрезание текущего пути папки из набора результатов
  • Отметить появление ключевого слова с другим цветом
  • Инструмент ack.pl и флаги ack.pl
  • Переупорядочить текстовый файл путем добавления строк данных со строкой заголовка
  • Сценарий Bash для мониторинга журнала, сопоставления ключевых слов и отправки команд
  • sed / awk / grep найти строку между точкой с запятой
  • анализировать HTML в Bash (когда grep просто недостаточно)
  • Как найти несколько строк в файлах?
  • Перенаправление grep в файл не работает
  • Использование обратной косой черты в разных командах
  • Список точных строк в файле
  • Linux и Unix - лучшая ОС в мире.