2017-01-03 13 views
2

ログファイルの行からの入力を昨日の日付と比較しようとしていますが、その差が1日以上であれば、ログファイルからの行。bash:日付なしのSolarisで2つの日付を比較する方法-dオプション

ログファイル:

$more ActiveX2Alarms.log 
2016-09-30 01:40:14 MET;faultManager:[email protected][email protected]@[email protected]@[email protected]|alarm-2632-3-698;ET_AO_L_0165_abcde;major;2632 
;lte.IK4009022;3;698 
2016-11-01 08:10:51 MET;faultManager:[email protected][email protected]@[email protected]@[email protected]|alarm-2632-3-698;ER_AO_L_4283_abcde;minor;2632;lte.IK4009022;3;698 
2017-01-03 12:14:31 MET;faultManager:[email protected][email protected]@[email protected]@[email protected]|alarm-2632-3-698;EM_AO_L_4065_ 
abcde;minor;2632;lte.IK4009022;3;698 

私はCygwinを使用してWindows上でテスト環境を作成しました。 Cygwinでは、私はo/pに成功しました。ここで

私が使用した最初のコードです:

awk -v d="$(date -d "yesterday" +'%Y-%m-%d %H:%M:%S')" '$1 " " $2 < d' /cygdrive/f/Script_X2/Final/Last_Trial/ActiveX2Alarms.log 

結果:

2016-09-30 01:40:14 MET;faultManager:[email protected][email protected]@[email protected]@[email protected]|alarm-2632-3-698;ET_AO_L_0165_abcde;major;2632 
;lte.IK4009022;3;698 
2016-11-01 08:10:51 MET;faultManager:[email protected][email protected]@[email protected]@[email protected]|alarm-2632-3-698;ER_AO_L_4283_abcde;minor;2632;lte.IK4009022;3;698 

しかし、私はエラーを受け取ったメインサーバ上で同じコマンドを使用して:

date: illegal option --d 

検索を私はそれがインストールされたSolarisパッケージ

0に関連していることを理解したエラーのために
$uname -a 
SunOS xxxxxx 5.10 Generic_150400-15 sun4u sparc SUNW,SPARC-Enterprise 

$date --version 
date: illegal option -- version 
usage: date [-u] mmddHHMM[[cc]yy][.SS] 
     date [-u] [+format] 
     date -a [-]sss[.fff] 
$date --help 
date: illegal option -- help 
usage: date [-u] mmddHHMM[[cc]yy][.SS] 
     date [-u] [+format] 
     date -a [-]sss[.fff] 

私はこの問題を避けるために次のコードを使用しましたが、出力を出すわけではありません...何かが間違っているので、助けてください! YESTERDAY変数の割り当てを確認するために

$awk -v YESTERDAY="`TZ=GMT+20 date +'%d-%m-%Y %H:%M:%S'`" '$1 " " $2 < YESTERDAY' ActiveX2Alarms.log 
awk: syntax error near line 1 
awk: bailing out near line 1 

$/usr/xpg4/bin/awk -v YESTERDAY="`TZ=GMT+20 date +'%d-%m-%Y %H:%M:%S'`" '$1 " " $2 < YESTERDAY' ActiveX2Alarms.log 
$ 

が成功した:

$YESTERDAY="`TZ=GMT+20 date +'%d-%m-%Y %H:%M:%S'`"; echo $YESTERDAY 
02-01-2017 16:51:26 
+2

エラーメッセージ 'awk:1行目付近に構文エラーがあります。 awk:1行目に近づくと、古いawk(Solarisでは/ usr/bin/awk)が呼び出されます。そのawkを絶対に使わないでください。 Solarisでは、2番目の例のように/ usr/xpg4/bin/awkを使用するか、GNU awk(Cygwinで使用しているもの)をインストールしてください。独自の組み込み時間関数を持っていますので、 'date'と一緒に。 –

+0

Solaris 11以降の場合、 '-d'オプションをサポートするGNUの日付を使用することができます。これは、 'date'コマンドの代わりに' gdate'コマンドを使うことを意味します。以前のSolarisの場合は、積極的にGNU coreutilsパッケージ(GNU日付を含む)をインストールする必要があります。 – peterh

答えて

1

あなたの日付形式は、ログファイルとYESTERDAYの間で異なっているが、一致している必要があります。ログファイルは、Y-M-Dの順であるので、それを使用します。私のテストシステム(また、cygwinの)オン

awk -v YESTERDAY="`TZ=GMT+20 date +'%Y-%m-%d %H:%M:%S'`" '($1 " " $2) < YESTERDAY' ActiveX2Alarms.log 
            ^^^^^^^^ was %d-%m-%Y 

を、これはあなたがあなたの質問に示した出力の同じ2本のラインを提供します。

これは、awkが日付ではなく文字列を比較しているため、数値をソートするために日付がY-M-Dである必要があるためです。 awkは、日付の文字列を(私が知る限り)実際の日付に自動的に変換しません。 ($1 " " $2)にかっこを追加して、別の文字列と比較される文字列を作成していることを明確にしました。

注意:TZ=GMT+20ハックは非常にクールだと思うが、GMT + 20はMETよりも19時間だけ遅く、24時間ではない。したがって、誤った時刻にスクリプトを実行すると、YESTERDAYが正しく設定されません。 This answerには、タイムゾーンに関係なく、昨日の日付をbashにする方法の例があります。

0

昨日の検索方法は?
夏時間のため、24時間前は今日または昨日の前日にすることができます。 GNU-dateを使用せずにスクリプトを変更するには、次のトリックを使用します。

昨日は20時間前または30時間前です。どれ?まあ、今日ではない最新のもの。

yesterday=$(printf "%s\n" "$(TZ=GMT+30 date +%Y-%m-%d)" "$(TZ=GMT+20 date +%Y-%m-%d)" | 
    grep -v $(date +%Y-%m-%d) | tail -1) 

あなたは24時間の違いを見てみたい(と時間が含まれたい)、

yesterdaynow="${yesterday} $(date +'%H:%M:%S')" 

ようなものを使用DSTの切り替え時に、これは23または25時間前できることに注意してください。

注:「新しい」bashのバージョンを持っている場合は
、あなたはエポックに日付を変換し、その差を計算することができ、これを使用して https://stackoverflow.com/a/26804450/3220113
を参照して、他のprintfのオプションを使用することができます。

関連する問題