2012-01-20 64 views
4

我正在嘗試使用grep來檢查某些日誌並只選擇最近的條目。該日誌對他們多年的交通繁忙,因此它是愚蠢做在第一個不匹配行後使grep停止

tac error.log | grep 2012 
    tac error.log | grep "Jan.2012" 

並等待10分鐘,同時它通過數百萬行,我已經知道不會匹配。我知道在第一場比賽中有-m選項可以停止,但我不知道如何在首先不匹配時停止。我可以做類似grep -B MAX_INT -m 1 2011的東西,但這不是一個最佳解決方案。

grep可以處理這個問題還是會讓awk更有意義?

+0

如果你願意成爲一個可以嘗試'tail -n N'提取N個最近的行,然後再通過grep進行管道傳輸,以消除今年的所有行。 –

+1

我會使用awk或(實際)perl - 爲什麼不呢? – reinierpost

+3

爲什麼你讓你的日誌文件變得如此之大?聽起來你需要找出關於日誌旋轉的信息。 – tripleee

回答

3

如何使用awk這樣的:

tac error.log | awk '{if(/2012/)print;else exit}' 

這應該儘快退出不符合2012年線被發現。

+1

問題是:可以用'grep'來完成。 – reinierpost

1

我不認爲grep支持這一點。

但這裏是我的「爲什麼我們再次有awk」的答案:

tail -n `tac biglogfile | grep -vnm1 2012 | sed 's/:.*//' | xargs expr -1 +` biglogfile 

注意,這不會是準確的,如果你的日誌被寫入。

+0

你能解釋sed和xargs部分嗎?我瞭解其餘的。另外,我不認爲這個問題的措辭意味着任何解決方案都必須包含grep,只是這就是我開始的地方。 – mmdanziger

+0

只需嘗試分段查看部件的用途...但確定:'grep -n'打印行號與匹配的行,'sed'只保留行號,'xargs expr'減少1行。 – reinierpost

2

這裏是蟒蛇的解決方案:

# foo.py 
import sys, re 
for line in sys.stdin: 
    if re.match(r'2012', line): 
     print line, 
     continue 
    break 

你@主機> TAC foo.txt的|蟒蛇foo.py

+1

無用的Cat。只需使用'python foo.py foo.txt'。 – tripleee

+2

我認爲他的意思是'tac foo.txt | python foo.py' – mmdanziger

+0

我更新了片段。是的,我的意思是「tac」。 – guettli

1

優秀one-line scripts for sed頁面救援:

# print section of file between two regular expressions (inclusive) 
sed -n '/Iowa/,/Montana/p'    # case sensitive 

換句話說,你應該能夠做到以下幾點:

sed -n '/Jan 01 2012/,/Feb 01 2012/p' error.log | grep whatevs 
+0

偉大的鏈接,但不會仍然通過整個文件? – mmdanziger

+0

是的,但取決於您可以製作正則表達式的時間和精度,它可以非常快。 – l0b0

+0

使用'grep'幾乎不會比同樣的搜索更快。 – tripleee

相關問題