2017-01-03 56 views
2

我試圖將日誌文件的行輸入的日期與昨天的日期進行比較,如果差異超過一天,則會打印來自日誌文件的行。bash:如何在沒有日期的Solaris上比較兩個日期-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 

我已經在Windows上使用Cygwin的創建測試環境。在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軟件包相關的錯誤

$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] 

因此,我使用下面的代碼來避免這個問題,但它沒有給出任何輸出...所以有些東西仍然是錯誤的,請幫助!

$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變量賦值是成功的:

$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上,使用/ usr/xpg4/bin/awk代替第二個例子,或者甚至更好地安裝GNU awk(這就是你在cygwin上使用的),它有它自己的內建時間函數,然後你不需要亂七八糟與'日期'。 –

+0

如果你在Solaris 11或更高版本,那麼你可以使用GNU date,它支持'-d'選項。這意味着使用'gdate'命令而不是'date'命令。如果您在早期的Solaris上,那麼您需要主動安裝GNU coreutils軟件包(包括GNU日期)。 – peterh

回答

1

你的日期格式的日誌文件,並YESTERDAY之間的不同,但應該匹配。由於日誌文件是在Y-M-d命令,使用:

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

在我的測試系統(也在cygwin),這使輸出相同的兩條線在你的問題顯示。

這是因爲awk正在比較字符串,而不是日期,所以日期必須在Y-M-D中進行數字排序。 awk不會自動將日期的字符串轉換爲實際日期(據我所知)。我在($1 " " $2)中添加了圓括號,以闡明您正在製作一個字符串,該字符串將與另一個字符串進行比較。

注意:雖然我認爲你的TZ=GMT+20黑客非常酷,GMT + 20只比MET提前19小時,而不是24小時。因此,如果您在錯誤的時間運行腳本,YESTERDAY將無法​​正確設置。 This answer有一個如何在bash中獲取昨日日期而不考慮時區的例子。

0

如何找到昨天?
由於夏令時,24小時前可以是今天或前天。如果您想在不使用GNU日期的情況下更改腳本,請使用以下技巧:

您確定昨天是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')" 

請注意,這可能是23或25小時前,開關DST時。

注:
當你有一個「新」的bash的版本,你可以使用其他的printf選項,請參閱 https://stackoverflow.com/a/26804450/3220113
使用這個,你可以可以轉換日期劃時代並計算它們的區別。