For ループで Grep を使用する

For ループで Grep を使用する

/home/errorcodes含む:

421 RP-001
421 RP-002
421 RP-003
550 SC-001
550 SC-002
550 SC-003
550 SC-004
550 DY-001
550 DY-002
550 DY-001
550 OU-001
550 OU-002

スクリプト:

#!/bin/bash

Elogs=/home/elogs.txt
Errors=/home/errorcodes
for i in `cat $Errors`; do
    #Get Error Logs
    grep "$i" /home/eximlog >> $Elogs
done

デバッグ:

+ cat /home/errorcodes
+ for i in '`cat $Errors`'
+ grep 421 /home/eximlog
+ for i in '`cat $Errors`'
+ grep RP-001 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 421 /home/eximlog
+ for i in '`cat $Errors`'
+ grep RP-002 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 421 /home/eximlog
+ for i in '`cat $Errors`'
+ grep RP-003 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep SC-001 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep SC-002 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep SC-003 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep SC-004 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep DY-001 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep DY-002 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep DY-001 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep OU-001 /home/eximlog
+ for i in '`cat $Errors`'
+ grep 550 /home/eximlog
+ for i in '`cat $Errors`'
+ grep OU-002 /home/eximlog

ループが「421」や「RP-001」などのすべてのコードを別々に読み取るのはなぜですか?重複した結果を取得します。 Grepはコードを単一の文字列として扱う必要があります。たとえば、"421 RP-001" デバッグは次のようになります。

+ for i in 'cat $Errors'
+ grep 421 RP-001 /home/eximlog

ベストアンサー1

シェルが実行されます噴射存在する$(cat $Errors)。なぜなら、一度に1行ではなく、一度に1単語しか得られないのです。

ループが欲しいですwhile read...

while read -r line; do
    #Get Error Logs
    grep "$line" /home/eximlog >> $Elogs
done <"$Errors"

readライン指向です。一度に1行ずつ読みます。

あるいは、これがうまくいく可能性があり、屋根ふきはまったく必要ありません。

 grep -f "$Errors" /home/eximlog

この-fオプションは、grepファイルからパターンを1行に1つずつ読み込むように指示します。

また、エラーコードパターンは正規表現ではなく固定文字列のようです。この場合、不快な驚きを防ぐために、-F次のオプションを追加してくださいgrep

 grep -Ff "$Errors" /home/eximlog

おすすめ記事