0

巨大なログファイルのエントリを見つけるために毎日実行する grep コマンドがあります。

このコマンドは、開発環境で正常に機能します。しかし、本番環境では、ログファイルのエントリとは異なる応答が出力されます。

コマンドは次のとおりです。

logentry=$(grep -m1 -oP '.*(?<=Reset\s).*' $log)

ログ ファイルの実際のエントリ:

******Reset  Counter:[Total:1849766] [Success:1849766]  [Insert:102]  [Update:1848861]  [Delete:803]  [Key:0]

コマンド出力:

******Reset  Counter:[Total:1849766] 1  [Insert:102]  [Update:1848861]  [Delete:803]  [Key:0]

期待される出力:

 ******Reset  Counter:[Total:1849766] [Success:1849766]  [Insert:102]  [Update:1848861]  [Delete:803]  [Key:0]

grep コマンドの一貫性のない動作の背後にある理由は何でしょうか?

4

1 に答える 1

0

@Ed Morton さん、コメントありがとうございます。修正は正常に機能しています。
根本的な原因: 変数は引用符で囲まれていないため、グロビング、単語分割、およびファイル名の展開に対してオープンであるため、最終的な結果はディレクトリ内のファイルに依存します。

解決策: 代わりに echo "$logentry" を使用し、シェルの変数を常に引用符で囲みます。ただし、そうしないことで特定の目的を念頭に置き、すべての意味を完全に理解する必要がある場合を除きます。

bash/POSIX シェルで変数を引用するのを忘れた場合のセキュリティへの影響

于 2016-02-28T05:55:20.197 に答える