Использовать строки в файле как имена файлов для grep? - PullRequest
3 голосов
/ 27 марта 2009

У меня есть файл, который содержит имена файлов (и полный путь к ним), и я хочу найти слово во всех них. некоторый псевдокод для объяснения:

grep keyword <all files specified in files.txt>

или

cat files.txt > grep keyword
cat files txt | grep keyword

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

Ответы [ 5 ]

7 голосов
/ 27 марта 2009
cat files.txt | xargs grep keyword

или

grep keyword `cat files.txt`

или (эквивалентно предыдущему, но сложнее не понять)

grep keyword $(cat files.txt)

должен сделать трюк.

Ловушка:

  • Если файл files.txt содержит имена файлов с пробелами, любое из решений будет работать неправильно, поскольку «Это имя файла.txt» будет интерпретироваться как четыре файла: «Это», «есть», «а» и "filename.txt". Хорошая причина, почему у вас не должно быть пробелов в ваших именах файлов.

    • Есть способы обойти это, но ни один из них не тривиален. (найдите ... -print0 / xargs -0 один из них.)
  • Вторая (cat) версия может привести к очень длинной командной строке (которая может выйти из строя при превышении ограничений вашей среды). Первая (xargs) версия обрабатывает длинный ввод автоматически; xargs предлагает несколько опций для контроля деталей.

2 голосов
/ 27 марта 2009
tr '\n' '\0' <files.txt | LANG=C xargs -r0 grep -F keyword
  • tr будет разделять имена символом NUL, чтобы пробелы не были значительными (обратите внимание на соответствующую опцию -0 для xargs).
  • xargs -r запустит один процесс grep для «большого» количества файлов, но не запустит процесс grep, если файлов нет.
  • LANG = C означает использование быстрых подпрограмм для сопоставления, а не медленных локальных
  • grep -F означает использовать быстрое сопоставление строк, а не медленное сопоставление регулярных выражений
2 голосов
/ 27 марта 2009

Оба ответа из DevSolar работают (проверено на Linux Ubuntu), но версия xargs предпочтительнее, если файлов может быть много, поскольку она не будет работать при ограничении длины командной строки.

так:

cat files.txt | xargs grep keyword

это путь

0 голосов
/ 02 апреля 2017

bash, ksh & zsh версия:

grep keyword $(<files.txt)
0 голосов
/ 27 марта 2009

Долгое время, когда в последний раз создавался скрипт оболочки bash, но вы могли сохранить результат первого grep (который находит все имена файлов) в массиве и выполнить итерацию по нему, выполняя еще больше команд grep.

Хорошей отправной точкой должно стать руководство по написанию сценариев bash.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...