2009-12-03 42 views
1

最近有一位同行和我在GNU grep 2.5.1中發現了一個有趣的bug,其中標準輸入行數超過200,000,000個字符會導致grep失敗,即使模式不在長線之一。但是,如果grep用grep match file讀取文件,它工作正常。看來這個bug在2.5.3中被修復。奇怪的grep 2.5.1 bug在cat'd閱讀長行

cat big_file | grep pattern # this dies with an exit code 0 after encountering a long line 

grep pattern big_file # works fine! 

有沒有人知道爲什麼會發生這種情況?線路限制是真正的原因嗎?

+0

第一個例子是沒用的貓用的,所以不要用它。你的問題解決了。以 – ghostdog74 2009-12-04 08:36:15

+0

貓爲例,真正的stdin來自腳本。 – Vince 2009-12-04 16:30:52

+0

不同之處在於grep可以將文件映射到內存中,但它沒有緩衝區標準輸入 – 2012-10-05 12:08:23

回答

1

我正在查看通過提交,但我找不到任何東西。你可以去看看它。

http://git.savannah.gnu.org/cgit/grep.git/log/?ofs=200

鏈接到頁面2.5.1。從那裏往回走,試圖找到它。

+0

的其他選項我也查看了提交(「使用源碼,Luke」!),也沒有找到任何東西。這很不幸;如果你不能相信你的工具,你可以信任什麼? – Vince 2009-12-04 02:38:57

2

在閱讀非常長的代碼時遇到或遇到過內存耗盡問題,但在大多數系統上,分配200MB不會失敗。

http://savannah.gnu.org/bugs/?9886

我相信直接讀取時,顯然從一個管道讀取的時候,或許這就是區別是不是一種選擇,它使用內存映射文件。

另外,你的模式有多複雜?有一個已知的grep限制,其中大量計數的{n,m}選項會導致分配大量內存。