2017-01-02 56 views
2

我正在嘗試計算no。在給定日期範圍內打印的線條。得到沒有。爲日期範圍打印的行數

這是我的輸入和輸出:

grep -inr "\[HSM \]Handle Identity Request. Send Identity Response. timeout: 1550s" *ActNac* 
ActNacd.txt:47:2017-01-02 09:10:13 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2016-12-20_20-39-18.txt:171:2016-12-19 13:23:48 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2016-12-20_20-39-18.txt:217:2016-12-19 14:27:26 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2016-12-26_09-44-47.txt:47:2016-12-25 19:26:13 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2016-12-26_09-44-47.txt:91:2016-12-25 20:30:38 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2016-12-27_07-32-25.txt:47:2016-12-26 11:08:28 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2016-12-27_18-06-29.txt:47:2016-12-27 07:35:55 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2016-12-30_08-22-16.txt:48:2016-12-28 18:04:19 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2017-01-02_06-56-52.txt:47:2016-12-30 08:24:19 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2017-01-02_09-07-23.txt:47:2017-01-02 06:59:33 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 

我想找到沒有。自2017年12月20日至2017年12月30日之間印刷的線條。

開始日期和結束日期都沒有確定,所以如果我使用sed命令狀

grep -inr "\[HSM \]Handle Identity Request. Send Identity Response. timeout: 1550s" *ActNac* | sed -n '/2016-12-20/,/2017-12-27/p'" 

,但如果我提供的輸入,如:

grep -inr "\[HSM \]Handle Identity Request. Send Identity Response. timeout: 1550s" *ActNac* | sed -n '/2016-12-19/,/2017-12-27/p'" 

它不給任何輸出,因爲開始日期與任何行不符合輸入日期。沒有日期2016-12-19的日誌文件。

是否有任何其他方式使用sed/awk/grep命令獲取輸入日期範圍內的行數。

+1

要獲得日e從任何東西輸出的行數,只需將輸出輸出到'wc -l'。 –

+0

我必須從20-27/12過濾掉適當的行然後得到我要使用wc -l –

回答

2

您可以單獨使用awk

要獲得單獨計數,

awk -F'[: ]' '$3 >= "2016-12-16" && $3 <= "2016-12-26 && NR>1"{count++;}END{print count}' newfile 
5 

獲得實際的日誌,我已經使用日期實際並不存在的日誌中,

awk -F'[: ]' '$3 >= "2016-12-22" && $3 <= "2016-12-29" && NR>1' newfile 
old_ActNacd_2016-12-26_09-44-47.txt:47:2016-12-25 19:26:13 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2016-12-26_09-44-47.txt:91:2016-12-25 20:30:38 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2016-12-27_07-32-25.txt:47:2016-12-26 11:08:28 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2016-12-27_18-06-29.txt:47:2016-12-27 07:35:55 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 
old_ActNacd_2016-12-30_08-22-16.txt:48:2016-12-28 18:04:19 - [HSM ]Handle Identity Request. Send Identity Response. timeout: 1550s 

得到計數,使用{count++;}END{print count}子句在第一個命令中。

+0

它應該只打印4,因爲只有4個日誌(2016-12-26 2日誌和2日誌2016年12月27日)。但它打印10即沒有。爲輸入文件提供的行。 –

+0

謝謝你的努力。 –

+0

感謝您的努力。在上圖中,2016-12-30不應包含日誌,因爲我們的結束日期是2016-12-29。同樣,如果startdate是2016-12-19,那麼只包含2016-12-20的日誌。答案非常接近。你能否包括任何邊界條件來檢查它。謝謝!!!!! –

0

您所遇到的困難與計數行無關(這很容易,只需將數據傳輸至wc -l),但是需要比較日期。如果您想比較日期,最簡單的方法就是將它們轉換爲合理的表示形式,以便比較容易。例如,紀元時間。一個簡單的方法來做到這一點用Perl:

perl -mTime::Piece -ne 'm/[^:]*:[^:]*:([-0-9]*) /; 
    $t=Time::Piece->strptime($1, "%Y-%m-%d"); print if $t > 1482192000;' input 

這將打印的日期是過去1482192000(午夜北京時間12月20日)的線路。算來,要麼指望他們在Perl:

perl -mTime::Piece -nE 'm/[^:]*:[^:]*:([-0-9]*) /; 
    $t=Time::Piece->strptime($1, "%Y-%m-%d"); $v++ if $t > 1482192000; 
    END{say $v}' input 

或只是管WC:

perl -mTime::Piece -ne 'm/[^:]*:[^:]*:([-0-9]*) /; 
    $t=Time::Piece->strptime($1, "%Y-%m-%d"); print if $t > 1482192000;' input | 
wc -l 
0

當所有行日期字符串,你可以這樣做
grep -Ec "^2016-12-2" *ActNac*(直到2016- 12-30不含30),

grep -Ec "^2016-12-(2|30)" *ActNac*