2016-10-08 7 views
2

ファイルが存在する場合は、ファイル内に異なる単語 "bot、spyware、virus"の特定の配列を見つけるスクリプトです。配列内にgrepを使用

#!/bin/bash 

#strings to find in file 
NAME[0]="bots" 
NAME[1]="spyware" 
NAME[2]="virus" 

#location of file 
LOGS=/home/testing.txt 

#define function to grep any of the above mentioned array strings in file 
func(){ 
if `grep "${NAME[*]}" $LOGS`; then 
echo "CRITICAL: ${NAME[*]}" 
else 
echo "errors not found" 
exit 
fi 
} 

#file exist or not exist 
if [ -f $LOGS ]; then 
    echo " File Found" 

    #call functions 
    func 
    modified 

    else 
    echo "File Not Found" 
    exit 

しかし、grep "${NAME[*]}" $LOGSは機能しません。以下のエラーが表示されます。

grep: virus: No such file or directory 
grep: bots: No such file or directory 
+1

'set -x 'を使ってシェルスクリプトのデバッグトレースを有効にすることを学ぶ(' set + x'をオフにする)。そして、arrを 'grep 'a | b | c' file'のような検索ターゲットに変換する必要があることがわかります。そして2番目の素晴らしいQですが、 'func()'コードしか見る必要がないので、Qを非動作コードにすることを学んでください。がんばろう。 – shellter

答えて

2

問題のある部分の解決方法を示します。

grepがファイルFILEの配列KEYWORDSの少なくとも1つのエントリを見つけたときにif-bodyに移動します。
次のコードは、または*のような特殊文字を持つ配列エントリに対して機能します。

KEYWORDS[0]="virus" 
KEYWORDS[1]="two words" 
KEYWORDS[2]="special chars .+*?|()[]^&" 

if grep -qF "${KEYWORDS[@]/#/-e}" -- "$FILE"; then 
    # found a keyword 
fi 

ここではどうなりますか?

  • grep -q
    出力されていない何かを。最初の試合を終了します。既にキーワードが見つかった場合は、完全なファイルをスキャンする必要はありません。

  • grep -F
    固定ストリングを検索します。 *,|、または+のような文字は、特別な意味を失います。

  • "{KEYWORDS[@]}"
    配列の各エントリは、1つの引用符付き文字列に展開されます。ここで"virus" "two words" "special chars .+*?|()[]^&"

  • "${KEYWORDS[@]/#/-e}"
    配列の各エントリの前に追加-e。 Grepはこのオプションを使用して複数のパターンを検索できます。 grep -e"FirstPattern" -e"SecondPattern" ...

  • grep Pattern -- "$FILE"
    --"$FILE"はファイル名として解釈されるべきであること、ヒントです。そのファイル名は-eFunnyとすることができます。これは、grepがファイル名が指定されていないと考えて、stdinからの入力を待つため、スクリプトを停止します。その必要はありませんが、確立するのはいい習慣です。いわゆるダブルダッシュは、grepだけでなく、ほとんどのコマンドで使用できます。

+0

ありがとう、それは私のために働いた。 – blaCkninJa

関連する問題