2014-02-13 102 views
1

我有試圖兩個日期awk中兩者之間 - 幾乎工作

之間找出一個日誌文件條目的csh腳本(腳本他們輸入爲DD/MM $ start_date和$ END_DATE/YYYY但我在這裏簡單)

more text_B_14_FEB_03.dt | grep TMYO 

TMYO140043J:=TMYO140043J  P33BJm SOLO   03/02/2014 
TMYO140044J:=TMYO140044J  P4m FINL   03/02/2014 
TMYO140044M:=TMYO140044M  P3BJ FINL   03/02/2014 
TMYO140045M:=TMYO140045M  P33BJq MARS   04/02/2014 
TMYO140046M:=TMYO140046M  P33BJq RENN   04/02/2014 
TMYO140047M:=TMYO140047M  P33BJl AKHT   05/02/2014 
TMYO140048M:=TMYO140048M  P3l MACL   05/02/2014 
TMYO140049M:=TMYO140049M  P3q HAYE   06/02/2014 
TMYO140050M:=TMYO140050M  P3q ROCH   06/02/2014 
TMYO140051M:=TMYO140051M  P3q FORR   06/02/2014 
TMYO140052L:=TMYO140052L  P3v ROSE   07/02/2014 
TMYO140053L:=TMYO140053L  P3v CAIR   07/02/2014 
TMYO140054L:=TMYO140054L  P3v MURR   07/02/2014 

我曾嘗試以下,但它不能正確地從上年處理日期?

more text_B_14_FEB_03.dt | grep TMYO | awk '$5>="02/01/2013" && $5<="13/02/2014"' 

TMYO140043J:=TMYO140043J  P33BJm SOLO   03/02/2014 
TMYO140044J:=TMYO140044J  P4m FINL   03/02/2014 
TMYO140044M:=TMYO140044M  P3BJ FINL   03/02/2014 
TMYO140045M:=TMYO140045M  P33BJq MARS   04/02/2014 
TMYO140046M:=TMYO140046M  P33BJq RENN   04/02/2014 
TMYO140047M:=TMYO140047M  P33BJl AKHT   05/02/2014 
TMYO140048M:=TMYO140048M  P3l MACL   05/02/2014 
TMYO140049M:=TMYO140049M  P3q HAYE   06/02/2014 
TMYO140050M:=TMYO140050M  P3q ROCH   06/02/2014 
TMYO140051M:=TMYO140051M  P3q FORR   06/02/2014 
TMYO140052L:=TMYO140052L  P3v ROSE   07/02/2014 
TMYO140053L:=TMYO140053L  P3v CAIR   07/02/2014 
TMYO140054L:=TMYO140054L  P3v MURR   07/02/2014 

這從錯誤錯過2014年3月2日迄今錄時我改變的開始日期2013年4月1日?

more text_B_14_FEB_03.dt | grep TMYO | awk '$5>="04/01/2013" && $5<="13/02/2014"' 

TMYO140045M:=TMYO140045M  P33BJq MARS   04/02/2014 
TMYO140046M:=TMYO140046M  P33BJq RENN   04/02/2014 
TMYO140047M:=TMYO140047M  P33BJl AKHT   05/02/2014 
TMYO140048M:=TMYO140048M  P3l MACL   05/02/2014 
TMYO140049M:=TMYO140049M  P3q HAYE   06/02/2014 
TMYO140050M:=TMYO140050M  P3q ROCH   06/02/2014 
TMYO140051M:=TMYO140051M  P3q FORR   06/02/2014 
TMYO140052L:=TMYO140052L  P3v ROSE   07/02/2014 
TMYO140053L:=TMYO140053L  P3v CAIR   07/02/2014 
TMYO140054L:=TMYO140054L  P3v MURR   07/02/2014 

任何想法awk部分哪裏出錯了?我很欣賞Perl是可能是最靈活的答案,但我振作腳本現在還沒有,我想首先要解決這個用awk。

+1

'more'完全[無用](http://partmaps.org/era/unix/award.html)在此處,將'grep'也可以很容易地分解出來; '的awk「/ TMYO/&& ......」 file' – tripleee

回答

2

你應該將日期轉換爲YYYYMMDD格式,以便可以按字典順序排列。你可以用gawkregex,或做子操作與awk做到這一點。這裏是gawk方式

more text_B_14_FEB_03.dt | grep TMYO | gawk 'match($5, "([0-9]+)/([0-9]+)/([0-9]+)", ary) {B 
=ary[3] ary[2] ary[1]; if (B < 20140213 && B> 20130104) print }' 
+0

這種運作良好,如圖所示 - 我又試圖轉換我的變量送入它,但它並沒有這樣的... '更text_B_14_FEB_03.dt | grep TMYO | gawk'match($ 5,「([0-9] +)/([0-9] +)/([0-9] +)」,ary){B = ary [3] ary [2] ary [ 1];如果(B < 「$ end_date_mod」 && B> 「$ start_date_mod」)打印$ 1}'' – scottyjock

+0

@scottyjock我覺得單引號防止bash的到substitue您的變量。然後,你應該雙引號awk語句並且轉義現有的引號,例如'a = s awk「BEGIN {print \」$ a \「}」

+1

這是值得的,更多A | grep B | awk'C {D}'寫得比'awk'/ B/&& C {D}'A'更好,沒有'more'(或者'cat'或'dd'或者其他什麼替代品;'tar'?),沒有單獨的'grep'。 – tripleee

4

您需要解析日期秒並加以比較。你必須使用mktime()功能,接受帶有日期的各部分的字符串,所以你必須先split()它。這個程序是奇怪的,因爲它有很多重複的代碼,但它似乎工作,我希望你的想法:

awk ' 
    BEGIN { 
     date1 = "04/02/2014" 
     split(date1, arr, "/") 
     seconds1 = mktime(arr[3] " " arr[2] " " arr[1] " 0 0 0") 

     date2 = "06/02/2014" 
     split(date2, arr, "/") 
     seconds2 = mktime(arr[3] " " arr[2] " " arr[1] " 0 0 0") 
    } 

    { 
     split($NF, arr, "/") 
     s = mktime(arr[3] " " arr[2] " " arr[1] " 0 0 0") 

     if (s >= seconds1 && s <= seconds2) { 
      print $0 
     } 
    } 
' infile 

你的第二個示例數據,它產生:

TMYO140045M:=TMYO140045M  P33BJq MARS   04/02/2014 
TMYO140046M:=TMYO140046M  P33BJq RENN   04/02/2014 
TMYO140047M:=TMYO140047M  P33BJl AKHT   05/02/2014 
TMYO140048M:=TMYO140048M  P3l MACL   05/02/2014 
TMYO140049M:=TMYO140049M  P3q HAYE   06/02/2014 
TMYO140050M:=TMYO140050M  P3q ROCH   06/02/2014 
TMYO140051M:=TMYO140051M  P3q FORR   06/02/2014