/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