Grep output concerns

Итак, я использую grep на внешнем HDD

пример,

M:/

grep -rhI "bananas" . > out.txt

который выводит все строки в каталоге " M:/ ", содержащие " bananas "

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

0
26.11.2018, 01:44
2 ответа
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на новую строку:

grep -rlI "bananas" . | xargs -d '\n' cat > out.txt
1
28.01.2020, 02:33

grep -r "бананы" | вырезать -d: -f1 | xargs cat >> result.txt

grep

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

Результат: имя_файла:текстдля каждой строки. Например, foo.txt:бананы.

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

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

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

xargs

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

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

1
28.01.2020, 02:33

Теги

Похожие вопросы