3

2 つの個別の grep ステートメントを使用するスクリプトがあります。

grep -E "GET[^\"]*\.html" tmp.cleaned.log | grep -v "XMLHttpRequest" | wc -l

と、

grep -E "^[^\"]+\"[^\"]+\" \"[^\"]+\" \"[^\"]+\" \"[^\"-\\]+\"" tmp.cleaned.log | wc -l

結果の値を出力ログ ファイルに保存します。シェル プロンプトでスクリプトを手動で実行すると、ステートメント 680 と 10028 の両方で正しい結果が得られます。

ただし、crontab を使用してスクリプトをスケジュールすると、最初の行は正しい値 680 を返しますが、2 行目は 0 になります。

stderr と stdout をリダイレクトしましたが、ログに記録されているエラーはないようです。スクリプト自体のシバンに加えて、crontab に SHELL=/bin/bash も追加しました。crontab はユーザー root 用で、次のようになります。

SHELL=/bin/bash
16      */1     *       *       *       /u02/sites/webstats/rundaily.sh

スクリプトは、ディレクトリを正しい場所に変更することから開始されるため、パスの問題ではありません。さらに、両方のステートメントが同じファイルと実行可能ファイルを参照しています。

これを解決しようとすると、本当に気が狂います。どんな助けでも大歓迎です。

ありがとう。

更新

0 になった理由が分かった気がします。式にバグがありました。だったはず

grep -E "^[^\"]+\"[^\"]+\" \"[^\"]+\" \"[^\"]+\" \"[^\"-]+\"" tmp.cleaned.log | wc -l

それ以外の

grep -E "^[^\"]+\"[^\"]+\" \"[^\"]+\" \"[^\"]+\" \"[^\"-\\]+\"" tmp.cleaned.log | wc -l

これが 0 (一致なし) を返す理由です。ただし、cronとシェルで異なる結果が表示された理由はまだ説明されていません。10028 という値が tmp.cleaned.log の合計行数であることがわかりました。

そのため、シェルから実行すると、間違った正規表現を使用して一致しない場合でも、grep 式はすべての行を返しました。cron から同じ間違った正規表現を実行すると、grep は正しくゼロ行を返しました。

この動作の違いを理解することにまだ興味があります。

4

1 に答える 1