unix - точное - Показывать имя файла перед совпадением строки(grep)




grep точное совпадение (4)

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


Если у вас есть варианты -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-number

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

-H может быть расширением GNU, но -n указывается POSIX.


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

Вы хотите найти несколько файлов, скажем, журналы с разными именами, но шаблон (например, 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 build 1989.


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

grep 'pattern' file /dev/null

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

grep -n 'pattern' file /dev/null

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





grep