1. ホーム
  2. shell

[解決済み] date: 余分なオペランド %d' エラー

2022-02-18 18:40:17

質問内容

以下のような形式のテキストログファイルがあります。

Thread-28689296: Thu Aug 25 15:18:41 2016 [ info ]: xxxxx xxxxxx xxxxx

そこで、過去数分間に特定のエラーメッセージを見つけるために、cronジョブを実行したいと思います。次のコマンドを書きました。

awk -vDate=`date +%b %d %H:%M:%S %Y` -vDate2=`date --date="2 minutes ago" +%b %d %H:%M:%S %Y` '$5 > Date && $5 < Date2' /var/log/dummy.log  | grep "Fatal"

上記のコマンドでは、現在から2分前までのタイムスタンプを持つメッセージを、以下の文字列で検索しています。 Fatal .

しかし、次のようなエラーが発生しました。

date: extra operand %d'
Try date --help' for more information.
date: extra operand %d'
Try date --help' for more information.

dateコマンドを実行すると、以下のような結果が得られました。

date "+%b %d %H:%M:%S %Y"
Aug 25 15:25:01 2016

date --date="2 minutes ago" +"%b %d %H:%M:%S %Y" 
Aug 25 15:31:42 2016

ということは、私の awk スクリプトの日付コマンドは大丈夫なはずです。

また、2分間で見つかったエラーメッセージをファイルにリダイレクトし、アラートとしてメール送信したいのですが、まだそこまで至っていません。

私の awk スクリプトのどこが問題なのか、親切にアドバイスしてください。よろしくお願いします。

解決方法は?

ここで問題となるのは date そのものです。方法を見てみましょう。

と言っているのですね。

vDate2=`date --date="2 minutes ago" +%b %d %H:%M:%S %Y`

を使いたいからです。

date --date="2 minutes ago" +%b %d %H:%M:%S %Y

しかし、実行してみると、エラーが発生することがわかります。

日付: 余分なオペランド '%d'
詳細は 'date --help'を試してみてください。

問題は、FORMAT コントロールをダブルクォートで囲む必要があることです。

#                             v                  v
$ date --date="2 minutes ago" "+%b %d %H:%M:%S %Y"
Aug 25 14:49:31 2016

これが完了すると、あなたの完全な awk のワンライナーができる。

awk -v Date="$(date "+%b %d %H:%M:%S %Y")" \
    -v Date2="$(date --date="2 minutes ago" "+%b %d %H:%M:%S %Y")" \
     '$5 > Date && $5 < Date2' file

を使用していることに注意してください。 -v Date="$(date ...)" :