テーブルからデータセットをインポートしてresult.txt
。次に、そのファイルから各行を選択し、ログファイルから検索してその行があるかどうかを確認します。ログ・ファイルにない場合は、別のファイル(notfound.txt
AIXサーバーで作業していて次のコマンドerror)に書き込もうとしますgrep
。誰かが問題を特定するのに役立ちますか?
これは私のスクリプトです。
while read -r LINE; do
grep -q "$LINE" log.log
if [ $? -eq 0 ]
then
echo "$LINE" >> /home/notfound.txt
fi
done < result.txt
これにより、次のような結果が出ました。
grep: 認識されないフラグ: - 使用法: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [ - p [parasep]] -eパターンリスト... [-fパターンファイル...] [ファイル...]
使用法: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] [-eパターンリスト...] -fパターンファイル... [ファイル...]
使用法: grep [-r] [-R] [-H] [-L] [-E|-F] [-c|-l|-q] [-insvxbhwyu] [-p[parasep]] パターン_リスト[ファイル...]
答え1
$LINE
ダッシュで始まる値が含まれているようです。
次の方法でこれが発生するのを防ぎます。
grep -q -e "$LINE"
より一般的には、ほとんどのUnixコマンドは--
オプションの終わりを表示することを可能にするので、この「オプションの終わり」オプションの後のすべての引数はオプションではなく文字通りの引数として扱われます。
echo
また、問題がある可能性があります。移植可能な解決策は、printf
最初の引数(フォーマット文字列)ではない限り、ダッシュで始まる引数をうまく処理するように切り替えることです。
また、大文字の変数名は使用しないでください。これはシステム用に予約されています。
最後に、スクリプトでは明示的なチェックはほとんど必要ありません$?
。これは既にif
及びwhile
他の制御構造によって行われる。
if grep -q -e "$line" log.log; then
printf '%s\n' "$line"
fi
最適化として、ループの外側にリダイレクトを配置すると、作業が速くなります。
while read -r line; do
grep -q -e "$line" log.log && printf '%s\n' "$line"
done <results.txt >notfound.txt