web-dev-qa-db-ja.com

現在のディレクトリのすべてのファイルで複数の文字列を検索するbashスクリプトを作成するにはどうすればよいですか?

次のようなbashスクリプトが必要です。

  1. 現在のディレクトリの各ファイルに対して「strings」コマンドを実行します
  2. Grepを使用して各ファイルの文字列の出力から特定の用語を検索します

次のものがありますが、スクリプトの出力には一致が表示されません。

#!/bin/bash

echo "Searching files in directory for secrets and urls"

for file in ./*
do
   echo "=====$file====="
   strings ${file} | egrep -wi --color 'secret\|password\|key\|credential|\http'
done

私も試しましたstrings $file | egrep -wi --color 'secret\|password\|key\|credential|\http'およびeval "strings ${file} | egrep -wi --color 'secret\|password\|key\|credential|\http'"しかし、これらは機能していないようです。スクリプトはファイル名を出力しますが、一致は出力しません。

2
the_endian

grep -Eと同じegrepを使用しています。つまり、拡張正規表現を使用できます。

拡張正規表現では、|は代替(これが使用したいものです)であり、\|はリテラル|文字に一致します。

したがって、あなたは欲しい

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
Kusalananda

forループは不要です。 stringsを使用してファイル名と10進オフセットを出力し、3文字以上の文字列をegrepにパイプします。

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

"key"を見逃さないように、デフォルトの4文字ではなく3文字が必要です。

サンプルの入力ファイルがないため、/bin/ディレクトリの最初の10ヒットを示すデモを次に示します。

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
agc