我們最近發生了一起Tomcat服務器崩潰的事件,該服務器生成了一個82.7 GB的“ catalina.out”日誌文件,我將其保存以進行法醫學分析。
哪些macOS編輯器可以在不佔用80 GB RAM或不凍結15分鐘的情況下打開怪物文本文件?
我們最近發生了一起Tomcat服務器崩潰的事件,該服務器生成了一個82.7 GB的“ catalina.out”日誌文件,我將其保存以進行法醫學分析。
哪些macOS編輯器可以在不佔用80 GB RAM或不凍結15分鐘的情況下打開怪物文本文件?
我不會嘗試打開它……我寧願這樣做:
類似的東西:
grep“ crash” My80GbFile.txt |更多
如果大文件不是“行定界”
split -b 10M My80GbFile.txt
但是,如果大文件只是行的負載,則在這種情況下(如前所述)按行分割(每個子文件100,000)。
split -l 100000 My80GbFile.txt
就您的迫切需求而言,適用於macOS的最佳免費視覺編輯器是 BBEdit(已鏈接至Mac App Store下載),它的作用非常強大-真正的強大工具。擁有它之後,您還可以支付pro / automation / out of感謝功能的費用,但是如果您願意並喜歡這個價格,它將永久免費。
我還使用 vi
進行編輯,但是這打開了一大堆蠕蟲,它們需要外殼,終端應用程序或其他應用程序,並且需要一些學習來學習如何退出編輯器(tldr;嘗試ZZ或ZQ),對其進行自定義,並教會您的大腦考慮對摘要中的文本進行操作,而不是使用鼠標來選擇項目。另外,像 less
或 more
或 bat
之類的尋呼機也非常友好,可以入門並在海量文件中導航。 (並且 bat為您提供 wings strike>很棒的顏色和語法意識)。
釀造蝙蝠
對於您來說,如果您可以在其中使用搜索功能,macOS隨附的控制台應用程序可能也值得一看。從聚光燈下啟動該應用程序並將您的怪物文件拖到窗口中以進行窺視。
請勿(將其作為一個文件打開)
您是否有任何特定原因不能簡單地使用腳本將其分成大約1GB的塊?
是的,搜索和類似功能會受到影響,但對於80GB的文件來說,情況已經如此。
如果腳本中有特定的斷點(時間戳中的天數,啟動/關閉消息),則也可以將其拆分。這樣,您甚至可能在文件中獲得更多的含義。
此外:一旦分解了任何體面的IDE(如IntelliJ IDEA或任何其他),您將可以在文本上方搜索功能。
[請注意:這來自程序員,所以可能不是您的方法或矯kill過正,我只能說它最終會起作用,您必須知道它是否值得]
在終端窗口中使用 less
。它將一次顯示一頁文件,只會在內存中加載大約這麼多的文件,因此您可以根據需要瀏覽多TB文件。
您可能應該添加 -n
選項,以防止 less
嘗試計算行號。所以:
less -n / path / to / file
請記住,您可以鍵入 less -n
(不要忘記最後的空格),然後將文件從Finder拖放到“終端”窗口,以將路徑添加到該文件。 / p>
以 less
格式查看文件後,您可以:
空格
(向下一頁), b
(向後一頁)... /
搜索。您也可以使用 /!
搜索不包含模式的行。反向搜索使用?
。但是所有搜索都會掃描整個文件。如果您經常這樣做,最好將其安裝在SSD上。 G
(大寫G)導航到文件中的特定行%
導航到文件的特定部分。因此, 50%
將使您到達文件的中間, 90%
到達最後10%,等等。如果您的日誌文件帶有時間戳,並且知道何時查找,最快的方法是:
使用“二進制搜索”查找您感興趣的文件的大致部分:
50%
,它將向您顯示文件的中間位置 75%
,否則轉到 25%
使用常規搜索(使用 /
前進或使用?
後退)找到您要查找的確切行(基於確切的時間戳,或者您知道的特定字詞顯示了問題。
這應該使您可以快速導航到文件的相關部分。
如果您認為要在文件的一個子集中進行大量搜索,則可以選擇將 grep
與特定日期或日期時間組合(以正確的格式)一起使用,將該子集提取到另一個較小的文件中。例如,如果您知道今天的崩潰發生在中午之後的幾天,而您的日誌涵蓋了幾個月,則可以
grep'2020-02-17 12:'/ path / to / file > extracted-log.txt
這將為您提供所有包含12:00:00到12:59:59之間的時間戳的行。當然,確切的格式取決於時間戳所使用的實際格式。
grep
將掃描整個文件一次以找到所有相關的行,這對於一個非常大的文件將花費一些時間,但是您將擁有一個更加易於管理的文件。 >
一種替代方法是使用 dd
使用 less
中的偏移量和長度來“提取”原始文件的一部分( Ctrl-G
獲取當前偏移量)。 dd
是一個非常強大的工具,但是使用起來非常危險,因此請謹慎使用(如果沒有,最好不要使用 root
或 sudo
您不確定自己在做什麼100%):
dd if = / destination_file.txt的/路徑/至/原始/文件bs = 1 skip = <start offset> count = <length>
請注意,這不是很有效,最好使用較大的塊大小( bs
),最好使用2的冪,例如1024,然後將 skip
和按該塊大小 count
。
我敢肯定,儘管我正在繪製空白,但肯定還有其他工具可以做到這一點。我認為某些 cat
版本可以做到這一點,但顯然不是macOS上的版本。
使用基於磁盤的文本編輯器時,文件不會完全加載到內存中-在UI上看到的是對編輯器已加載到內存中的內容的瀏覽。過去,我已經成功使用 UltraEdit進行大型日誌文件分析。其基於正則表達式的搜索工具和位置書籤特別有用。它可以迅速加載文件,並且您可以進行基於正則表達式的搜索。該網址會將您帶到下載頁面,您可以在其中下載30天的試用版。還有其他基於磁盤的文本編輯器。
已經有幾年了,所以我安裝了UltraEdit並打開了我擁有的最大文件。這是一個64 GB的二進製文件,它立即打開。搜尋字詞大約需要90秒。我用右下角的紅色矩形突出顯示了文件大小。Mac是MBP 2018,運行Mojave的RAM為8 GB。
嘗試Glogg。在下載頁面上有一個MacOs版本:
https://glogg.bonnefon.org/download.html
我不知道約80 GB的文件,但我regularly使用它(在Windos上)打開了高達5 GB的日誌文件,並且對那些文件(索引建立後的內存佔用約為100-150MB,並進行搜索)非常有效是very快速)。
儘管有一個註釋-它是只讀分析器,而不是編輯器。
即使Tolkien粉絲也不想要82.7GB的任何東西。您只希望其中的某些位;看到它便會知道。
甚至考慮使用分析整個文件的工具,從字面上看都是浪費時間。假設以100MB /秒的速度讀取文件,將花費15分鐘。如果要分析任何復雜性,速度會慢很多。
這裡的救命稻草是OS X建立在Unix之上。這是蘋果收購NeXT和喬布斯回來的很大一部分。這意味著您可以使用整個Unix工具套件,它們非常完善,並且在這裡得到很好的支持。
不使用perl可以有很多方法,但是由於perl內置在MacOS中並且可以無限擴展,所以我更願意從那裡開始(而不是在一個簡單的工具中這樣做,而是想在某種程度上改進查詢,然後點擊該工具的限制,並且必須在其他工具中重新製作)。因此,在名為“ xx”的文件中輸入以下內容:
$ len = -s“ filename.log”; #變量變為文件長度
打開($ IN,“ <”,“ filename.log”);
搜尋($ IN,$ len-10_000_000,0); #perl允許_的數字以提高可讀性
while(< $ IN>){#<>讀取一行。默認變量是元變量$ _
打印; #不帶參數,默認為元變量$ _
}
那不會讀取整個文件,只是尋找到指定位置(末尾10MB),然後讀取並打印所有內容到末尾。它只會將其打印到屏幕上,因此要發送到文件,請在調用它時執行以下操作:
perl xx > tailfile.txt
現在,您有一個10MB的tailfile.txt文件,您可以使用其他文件打開它。
有很多簡單的方法可以做到 ,但是假設您意識到“等等,我想做更多。我只想要錯誤和警告。”因此,您將打印命令更改為
如果/ error / i或/ warning / i,則打印;#//匹配文本,默認為$ _
如果您花足夠的時間來研究文檔,那麼也可以使用更簡單的工具來實現。但隨後,您決定需要在錯誤後的 中看到三行。就像那樣……您已經超出了簡單工具的範圍,但這在Perl中是微不足道的。您可以一直保持Perl永久填充。那裡有完整的編程語言。面向對象的一切。
一個大文件大概有99.999999%的冗餘(從字面上看),所以關鍵是要刪除出現了數十億次的行(在某種程度上相似),然後檢查剩下的行。
在Linux上,有一個名為 petit
的實用程序專門用於分析大型日誌文件。示例用法是 petit --hash /var/log/kern.log
。該實用程序可能是在Mac上找到或構建的。
它處理文件的每一行以刪除使該行唯一的內容;例如,從每一行中刪除日期,並用單個#字符替換所有數字字符串。然後將每個通用行進行哈希處理,以成為用於檢測相似行的指紋。
其結果是,每行僅輸出一次,且發生的次數非常多,從而極大地減少了數據的大小。凡是與眾不同的東西都可能會清楚地顯示出來,然後可以使用此處提供的其他答案中的實用工具來進行特定的搜索。
我不知道這個特定的實用程序對於這種大小的程序是否足夠性能。我敢打賭,因為它具有按幾個月或幾年的輸入量來繪製圖形的選項,除了少量的指紋外,不需要存儲很多東西。在最壞的情況下,您可以編寫自己的代碼:對於每條輸入行,將其通用化為指紋,對其進行哈希處理,然後將其添加到由哈希索引的hash + fingerprint + count數據庫中。
EDIT : petit
似乎使用了比預期更多的CPU和內存,因此我編寫了自己的簡單實現: https://github.com/curtmcd / hashlog。它使日誌文件一次通過。在我的家用Ubuntu服務器上,它的處理速度約為6.5秒/ GB。
“ joe”,又名Joe自己的編輯器,旨在僅根據需要加載文件的一部分。我從未在過大的文件上使用過它,但從未遇到過太大而無法打開的text.file。
絕對是妖魔。它不使用RAM打開文件。它只是從磁盤讀取。性能絕對令人難以置信。我之前已經檢查過500GB的密碼轉儲。
打開終端並使用vim打開它
vim filename.txt
P / s:
輸入vim並將文件拖到終端。然後按Enter。
要退出vim(不進行編輯):
:q!
我建議使用崇高文字。儘管它需要許可證,但可以免費下載和評估它,而沒有時間或功能限制。這意味著您或您的公司可以根據需要隨意嘗試。我個人使用它來調查大多數情況下甚至3-4GB的日誌,甚至12GB的SQL轉儲。初次打開時,它確實會遍歷整個文件以執行第一級索引等操作,但是它帶有一個進度條,用於指示整個過程的進度。