Как я могу получить 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 файлы (введите свое собственное значение поиска, конечно).