поиск нескольких строк в нескольких файлах в каталоге и печать строки и соответствующего имени файла, где это было найдено

Использовать ssh-agent для хранения ключа затем sshfs может использовать ключ от агента, не прося пароль. - Конечно, теперь необходимо предоставить пароль для добавления ключа к агенту. - mate-keyring мог бы помочь Вам с этим.

2
18.06.2014, 08:08
3 ответа

Вы должны просто позволить grep дать вам имена файлов. GNU grep может сделать так:

grep -HFf ../strings.txt *

Это даст вам вывод, который будет выглядеть так:

[filename]:[matched_line]

... для каждого совпадения в каждом файле в каталоге. Вы также можете получить номера строк:

grep -HnFf ../strings.txt *

... что обеспечивает...

[filename]:[line_number]:[matched_line]
2
27.01.2020, 22:06

Проблема в том, что Вы передаете по одному файлу одновременно в grep. Когда grep видит один файл в своей командной строке, он предполагает, что вы точно знаете, где вы ищете, поэтому имя файла не отображается перед совпадениями.

Хитрость заставить grep всегда выводить имя файла - это также передать /dev/null (где никогда не будет совпадений). В некоторых реализациях grep есть такая возможность: -H.

Дополнительно вы можете использовать -exec ... {}. + вместо -exec ... {} \; для выполнения программы для многих файлов за один раз. Это быстрее. Вы все равно должны передать /dev/null или -H, потому что может случиться так, что команда будет вызвана ровно для одного файла, либо потому, что есть один подходящий файл, либо потому, что есть много совпадений, требующих, чтобы grep вызывался несколько раз, и один раз случилось так, что речь шла об одном файле.

find -name 'LYFNRE.*' -exec grep -f file1.txt /dev/null {} +

grep GNU и последние реализации BSD (включая OSX) поддерживают возможность рекурсивного вызова grep без запроса find.

grep -R --include='LYFNRE.*' -f file1.txt -H .

Или же вы можете сделать рекурсивный глобус в оболочке командной строки. В zsh это работает нестандартно. В bash, вам нужно сначала запустить shopt -s globstar, и остерегайтесь, что bash возвращается через символические ссылки на каталоги (в отличие от find или zsh).

grep -f file1.txt /dev/null **/LYFNRE.*
1
27.01.2020, 22:06

используйте egrep:

egrep -n "str1|str2|str3" file_names

-n выведет номер строки в конкретном файле, в котором была найдена строка

.
0
27.01.2020, 22:06

Теги

Похожие вопросы