Отображение имени файла перед соответствующей строкой

Как я могу получить grep для отображения имени файла перед соответствующими линиями в его выходе?

Ответ 1

Попробуйте этот небольшой трюк, чтобы убедить grep в том, что он имеет дело с несколькими файлами, так что он отображает имя файла:

grep 'pattern' file /dev/null

Чтобы получить номер строки:

grep -n 'pattern' file /dev/null

Ответ 2

Если у вас есть опции -H и -n (man grep - ваш друг):

$ cat file
foo
bar
foobar

$ grep -H foo file
file:foo
file:foobar

$ grep -Hn foo file
file:1:foo
file:3:foobar

Опции:

-H, --with-filename

Напечатайте имя файла для каждого совпадения. Это значение по умолчанию, когда для поиска требуется более одного файла.

-n, --line -n Умбер

Приставьте каждую строку вывода к номеру строки на основе 1 в своем входном файле. (-n определяется POSIX.)

-H является расширением GNU, но -n определяется POSIX

Ответ 3

Никакой трюк не нужен.

grep --with-filename 'pattern' file

С номерами строк:

grep -n --with-filename 'pattern' file

Ответ 4

Как насчет этого, чему удалось добиться отчасти благодаря этому сообщению.

Вы хотите найти несколько файлов, скажем, журналы с разными именами, но шаблон (например, filename=logfile.DATE), внутри нескольких каталогов с шаблоном (например, /logsapp1, /logsapp2). Каждый файл имеет шаблон, который вы хотите grep (например, "init time"), и вы хотите иметь "init time" каждого файла, но зная, к какому файлу он принадлежит.

find ./logsapp* -name logfile* | xargs -I{} grep "init time" {} \dev\null | tee outputfilename.txt

Тогда outputfilename.txt будет чем-то вроде

./logsapp1/logfile.22102015: init time: 10ms
./logsapp1/logfile.21102015: init time: 15ms
./logsapp2/logfile.21102015: init time: 17ms
./logsapp2/logfile.22102015: init time: 11ms

В общем

find ./path_pattern/to_files* -name filename_pattern* | xargs -I{} grep "grep_pattern" {} \dev\null | tee outfilename.txt

Пояснение:

find команда будет искать имена файлов, основанные на шаблоне

тогда pipe xargs -I{} перенаправит вывод find на {}

который будет входом для grep ""pattern" {}

Тогда трюк, чтобы сделать grep отобразить имена файлов \dev\null

и, наконец, напишите вывод в файле с помощью tee outputfile.txt

Это работало для меня в grep версии 9.0.5 сборке 1989 года.

Ответ 5

Это небольшая модификация предыдущего решения. Мой пример ищет перенаправление stderr в сценариях bash: grep '2>' $(find . -name "*.bash")

Ответ 6

grep 'search this' *.txt

работал у меня, чтобы искать все .txt файлы (введите свое собственное значение поиска, конечно).