grep: AIX で認識されるフラグではありません。

grep: AIX で認識されるフラグではありません。

テーブルからデータセットをインポートしてresult.txt。次に、そのファイルから各行を選択し、ログファイルから検索してその行があるかどうかを確認します。ログ・ファイルにない場合は、別のファイル(notfound.txtAIXサーバーで作業していて次のコマンド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

関連情報