Как написать сценарий bash для поиска нескольких строк во всех файлах в текущем каталоге?

Поскольку вы используете компьютер компании, в которой работаете, обратитесь за помощью в ИТ-отдел. Возможно, изменение подсказки противоречит политике компании. Если нет, возможно, они могут создать для вас пользовательскую подсказку или обновить свою корпоративную подсказку -. В противном случае они, скорее всего, смогут помочь вам в создании собственных пользовательских подсказок.

Как упоминалось в комментариях, «подсказки хранятся в переменных $PS1, $PS2, И $PS3», хотя это может зависеть от разновидности вашей операционной системы, о которой вы забыли упомянуть.

2
02.05.2020, 09:49
2 ответа

Вы используете egrep, который совпадает с grep -E, т. е. позволяет использовать расширенные регулярные выражения.

В расширенном регулярном выражении |— это чередование (, которое вы хотите использовать ), а \|соответствует буквальному символу |.

Следовательно, вы хотите

grep -w -i -E 'secret|password|key|credential|http'

или

grep -i -E '\<(secret|password|key|credential|http)\>'

, где \<и \>соответствуют границам слов.

Или

grep -w -i -F \
    -e secret      \
    -e password    \
    -e key         \
    -e credential  \
    -e http

... если вы хотите выполнять сравнение строк, а не сопоставление с регулярным выражением.

Кроме того, вы должны всегда заключать раскрытие переменной в двойные кавычки. Это позволит вам также правильно обрабатывать файлы с именами, которые содержат символы пробела (, пробел, табуляцию, перевод строки )и имена, которые содержат символы подстановки имени файла (*, ?,[...]):

.
#!/bin/sh

for name in./*; do
    [ ! -f "$name" ] && continue    # skip non-regular files

    printf '==== %s ====\n' "$name"
    strings "$name" | grep...
done

См. также

10
28.04.2021, 23:16

Цикл forне нужен. Используйте stringsдля вывода имени файла и десятичного смещения, затем передайте любые строки длиной не менее трех символов вegrep:

strings -n 3 -f -t d./* 2> /dev/null | 
egrep '[[:alnum:][:punct:]]*(secret|password|key|credential|http)'\
'[[:alnum:][:punct:]]*$' 

Три символа вместо стандартных четырех нужны, чтобы не пропустить "ключ" .

Так как у нас нет примеров входных файлов, вот демонстрация, показывающая первые десять совпадений в каталоге /bin/:

strings -n 3 -f -t d /bin/* 2> /dev/null |  
egrep '[[:alnum:][:punct:]]*(secret|password|key|credential|http)'\
'[[:alnum:][:punct:]]*$' | 
head

Вывод в моей системе:

/bin/bash:   78590 rl_discard_keymap
/bin/bash:   78720 rl_executing_key
/bin/bash:   79076 rl_bind_key
/bin/bash:   79847 emacs_standard_keymap
/bin/bash:   79905 _rl_keymap
/bin/bash:   81110 _rl_executing_keyseq_size
/bin/bash:   81598 rl_bind_keyseq_if_unbound
/bin/bash:   81640 rl_bind_keyseq
/bin/bash:   81736 bind_keyseq_to_unix_command
/bin/bash:   81863 _rl_dispatching_keymap
2
28.04.2021, 23:16

Теги

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