Мне нужно выполнить grep для нескольких файлов с несколькими значениями.
Например: grep -f filename.txt /home/* -R
(имя_файла.txt содержит несколько значений)
Но мне нужно знать, какой файл содержит какое значение.
Например: /home/blah.txt содержит значение1, /home/aaa.txt содержит значение2 и т. д.
какие-либо предложения?
решение1
Это можно сделать, используя некоторые флаги, предоставляемые grep
.
Вы можете попробовать следующую команду:
grep -R -f filename.txt /home/*
будет искать любой шаблон внутри вашего filename.txt
файла и рекурсивно сопоставлять его со всеми файлами внутри вашей домашней папки. Вы получите такой вывод:
#here my filename contains the entries bash and Bingo
$grep -R -f filename.txt /home/*
/home/user/.bash_history:vi .bashrc
/home/user/.bash_history:vi .bashrc
/home/user/.bash_history:awk -v RS=END_WORD '/Bingo1/ && /Bingo2/' test2.txt | grep -o 'Pokeman.*'
grep
выведет имя файла и полную строку, содержащую ваш шаблон.
Если вы хотите отобразить только найденный шаблон, попробуйте выполнить следующую команду:
#here the -o flag only displays the matched values, and -n adds the line number
$grep -R -o -n -f test /home/*
/home/user/.bash_history:128:bash
/home/user/.bash_history:156:bash
/home/user/.bash_history:193:Bingo
решение2
Это должно подойти для вашей ситуации:
grep -HRnF '<pattern>' . --include "<file_name>"
Итак, чтобы найти слово «test» во всех файлах, заканчивающихся на .txt, используйте что-то вроде:
grep -HRnF 'test' . --include "*.txt"
решение3
В GNU grep
есть опция -o
:
-o, --only-matching
Вывести только совпавшие (непустые) части совпадающей строки, причем каждую такую часть следует вывести на отдельной строке вывода.
Так что это должно сделать то, что вы хотите.
grep -f filename.txt -R -H -o /home/*
Обратите внимание, что я также добавил -H
(-with-filename), чтобы всегда печатать имя файла.