Выход справки 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 
  • Насколько разумны утилиты unix?
  • zgrep против egrep против grep
  • Попытка grep url из источника html в .txt-файле с помощью sed
  • Почему этот простой скрипт grep / sed работает
  • Как обрабатывать файл, содержащий кавычки?
  • Укажите, сколько строк начинается с того, какие символы
  • Как получить строки, содержащие -R с grep
  • Как активно grep log за последние 15 секунд для фразы?
  • сравнить два файла, получить идентичный список
  • Как показать только скрытые каталоги, а затем найти скрытые файлы отдельно
  • ls и команда find, исключая определенный каталог
  • Linux и Unix - лучшая ОС в мире.