題:
我需要檢查一個82.7 GB(!)文本文件。有什麼可以打開的?
hbquikcomjamesl
2020-02-16 23:27:01 UTC
view on stackexchange narkive permalink

我們最近發生了一起Tomcat服務器崩潰的事件,該服務器生成了一個82.7 GB的“ catalina.out”日誌文件,我將其保存以進行法醫學分析。

哪些macOS編輯器可以在不佔用80 GB RAM或不凍結15分鐘的情況下打開怪物文本文件?

您是否需要閱讀文件以略讀有趣的細節或故障,還是需要搜索文件?文件的時間戳是否一致?以下答案都很合適,但在80GB以上時,您應該考慮一些日誌分析和搜索技術,以找到分析所需的數據。一個示例但沒有主題的問題是https://serverfault.com/questions/63297/good-free-tomcat-log-analyser
另請參閱:https://askubuntu.com/questions/28847/text-editor-to-edit-large-4-3-gb-plain-text-file 和https://vi.stackexchange.com/questions/149/how-can-i-open-very-large-files-with-good-performance
為提取記錄並將其添加為數據庫中的行的文件編寫解析器是否合理?數據庫旨在有效地排序和搜索數百萬條記錄;文本編輯器不是。
十三 答案:
79E09796
2020-02-17 18:01:34 UTC
view on stackexchange narkive permalink

較少的文件名

通過命令行,您可以直接查看文件,而無需將整個文件加載到內存中。

在查看任意大文件時,GNU較少使用默認的64k緩衝區空間。我認為macos中的功能越少越好,所以這是一個很好的答案。少了正則表達式搜索,可以讓您分頁瀏覽文件,等等。
這恰恰是最初的“更多”然後“更少”的目的。還有很多導航快捷鍵。Unix工具集非常有用,值得學習。
@WayneConrad`less`不是具有多種實現的標準程序;更少是基於more的GNU分頁器,是macOS附帶的。
+1是為了簡單起見,不是要求的編輯器,但它非常實用,有點掩蓋我的答案。
我懷疑普通的macOS用戶是否在使用_editor_之類的字眼時對_editing_的含義是否考慮得太仔細。OP可能恰好意味著_viewer_或_pager_。+1
“我還記得的最後一件事是,我正在`|`````更多`...”讓我+1!
“少”是“多”
Tim Seed
2020-02-17 16:08:01 UTC
view on stackexchange narkive permalink

我不會嘗試打開它……我寧願這樣做:

  1. grep-查找一些文本
  2. 分割-將文件切成10Mb的塊。
  3. ol>

    類似的東西:

      grep“ crash” My80GbFile.txt |更多
     

    如果大文件不是“行定界”

      split -b 10M My80GbFile.txt
     

    但是,如果大文件只是行的負載,則在這種情況下(如前所述)按行分割(每個子文件100,000)。

      split -l 100000 My80GbFile.txt
     
您可能要使用`grep -C5 crash`只是為了在每個匹配項的上方和下方都有幾行上下文。
這個。*請勿*在編輯器中打開85 GB的文件。首先消除所有絨毛(當然,不損害原始文件)。如果由於日誌記錄時間長而導致文件很大,請檢查接近事件的時間。如果它很大,因為它是一個巨大的系統狀態的快照,例如轉儲數據庫等,請嘗試著重於相關數據。
如果文件由行組成,而不是`split -b`,那麼最好執行`split -l`。否則,您將把行分成兩半。
我建議`grep“ crash” My80GbFile.txt |少”而不是“ grep“崩潰” My80GbFile.txt |更多`,只是為了更輕鬆地導航和使用帶有/鍵的搜索。
bmike
2020-02-17 00:36:20 UTC
view on stackexchange narkive permalink

就您的迫切需求而言,適用於macOS的最佳免費視覺編輯器是 BBEdit(已鏈接至Mac App Store下載),它的作用非常強大-真正的強大工具。擁有它之後,您還可以支付pro / automation / out of感謝功能的費用,但是如果您願意並喜歡這個價格,它將永久免費。

我還使用 vi 進行編輯,但是這打開了一大堆蠕蟲,它們需要外殼,終端應用程序或其他應用程序,並且需要一些學習來學習如何退出編輯器(tldr;嘗試ZZ或ZQ),對其進行自定義,並教會您的大腦考慮對摘要中的文本進行操作,而不是使用鼠標來選擇項目。另外,像 less more bat 之類的尋呼機也非常友好,可以入門並在海量文件中導航。 (並且 bat為您提供 wings strike>很棒的顏色和語法意識)。

 釀造蝙蝠
 

對於您來說,如果您可以在其中使用搜索功能,macOS隨附的控制台應用程序可能也值得一看。從聚光燈下啟動該應用程序並將您的怪物文件拖到窗口中以進行窺視。

BBEdit +1 – BareBones團隊多年來特別優化了該應用程序,以處理大量文本文件。
請添加此編輯器是否可以實際打開82.7G“ catalina.out”日誌文件。以及是否需要85G的RAM。
-1
@T.J.L。不需要確認。問題中在那裡有陳述。答案應該回答所提出的問題。
Linux上的Vim可以用於編輯非常大的文件,但是在嘗試打開它們之前,您需要了解如何做,並且可能需要禁用插件等。https://stackoverflow.com/questions/908575/how-to-edit-multi-gigabyte-text-files-vim-doesnt-work我認為Mac OS是一個類似的故事。儘管vim是我的首選文本編輯器,但還是不會真正推薦。
@T.J.L。[確認偏見](https://zh.wikipedia.org/wiki/Confirmation_bias)他們獲得的投票越多,未來獲得的投票就越多。而且,它們是_apple_ SE的“ 181K信譽主持人”。那是一個小池塘里的一條大魚。我沒有親自嘗試BBEdit,但是我曾嘗試對大型文件使用`less`和`more`,但這不是一個好主意,除非您喜歡等待程序在文件中查找文件。grep很好。“ ag”(Silver Surfer)很棒:我不知道82.7G(!)文本文件,但是它可以在不到60秒的時間內找到我128GB(!!)SSD上所有文件的字符串。
抱歉,這很笨拙,我並不是說聽起來很無禮,現在編輯為時已晚:一種更好的表達方式是,說這種問題不是Apple SE的正常標準票價。,並且我無意無意間對bmike的好名聲施以侮辱。
感謝@AaronF為您提供的“ ag”提示-太棒了。比grep快幾個數量級(可能是因為它忽略了`.gitignore`中的文件-例如`node_modules / **`)並很好地呈現了結果。
@AaronF:銀牌搜尋者,而不是衝浪者,對不對?
@AaronF無需道歉,但很高興接受了它的提議。我喜歡有關答案/範圍/適用性的問題。哎呀-簡明扼要,我對+1的答案就更少了。
Hobbamok
2020-02-17 16:02:10 UTC
view on stackexchange narkive permalink

請勿(將其作為一個文件打開)

您是否有任何特定原因不能簡單地使用腳本將其分成大約1GB的塊?

是的,搜索和類似功能會受到影響,但對於80GB的文件來說,情況已經如此。

如果腳本中有特定的斷點(時間戳中的天數,啟動/關閉消息),則也可以將其拆分。這樣,您甚至可能在文件中獲得更多的含義。

此外:一旦分解了任何體面的IDE(如IntelliJ IDEA或任何其他),您將可以在文本上方搜索功能。

[請注意:這來自程序員,所以可能不是您的方法或矯kill過正,我只能說它最終會起作用,您必須知道它是否值得]

jcaron
2020-02-18 00:18:04 UTC
view on stackexchange narkive permalink
  1. 在終端窗口中使用 less 。它將一次顯示一頁文件,只會在內存中加載大約這麼多的文件,因此您可以根據需要瀏覽多TB文件。

    您可能應該添加 -n 選項,以防止 less 嘗試計算行號。所以:

      less -n / path / to / file
     

    請記住,您可以鍵入 less -n (不要忘記最後的空格),然後將文件從Finder拖放到“終端”窗口,以將路徑添加到該文件。 / p>

  2. less 格式查看文件後,您可以:

    • 使用向上/向下箭頭導航,空格(向下一頁), b (向後一頁)...
    • 使用 / 搜索。您也可以使用 /!搜索不包含模式的行。反向搜索使用。但是所有搜索都會掃描整個文件。如果您經常這樣做,最好將其安裝在SSD上。
    • 使用<number>後跟 G (大寫G)導航到文件中的特定行
    • 使用<number>後跟導航到文件的特定部分。因此, 50%將使您到達文件的中間, 90%到達最後10%,等等。
  3. ol>

    如果您的日誌文件帶有時間戳,並且知道何時查找,最快的方法是:

    1. 打開文件
    2. 使用“二進制搜索”查找您感興趣的文件的大致部分:

      • 輸入 50%,它將向您顯示文件的中間位置
      • 如果要刪除零件,請轉到 75%,否則轉到 25%
      • 重複直到您縮小到相關部分
    3. 使用常規搜索(使用 / 前進或使用後退)找到您要查找的確切行(基於確切的時間戳,或者您知道的特定字詞顯示了問題。

    4. ol>

      這應該使您可以快速導航到文件的相關部分。


      如果您認為要在文件的一個子集中進行大量搜索,則可以選擇將 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上的版本。

Vinil
2020-02-18 08:41:46 UTC
view on stackexchange narkive permalink

使用基於磁盤的文本編輯器時,文件不會完全加載到內存中-在UI上看到的是對編輯器已加載到內存中的內容的瀏覽。過去,我已經成功使用 UltraEdit進行大型日誌文件分析。其基於正則表達式的搜索工具和位置書籤特別有用。它可以迅速加載文件,並且您可以進行基於正則表達式的搜索。該網址會將您帶到下載頁面,您可以在其中下載30天的試用版。還有其他基於磁盤的文本編輯器。

已經有幾年了,所以我安裝了UltraEdit並打開了我擁有的最大文件。這是一個64 GB的二進製文件,它立即打開。搜尋字詞大約需要90秒。我用右下角的紅色矩形突出顯示了文件大小。Mac是MBP 2018,運行Mojave的RAM為8 GB。

Screenshot of UltraEdit with a 64GB file open and the search window open

是的,UltraEdit將解決問題。但不是“立即”。這樣大小的文件將被攪動5-10分鐘:)
@jwenting您可能會感到驚訝-UE非常擅長處理大文件。
@MikeBrockington我知道,我使用UE。雖然花了大約5分鐘的時間才能打開25GB的SQL轉儲(這很有幫助,但沒有其他東西可以打開它),但幾週前必須更改為在另一台計算機上加載。
@jwenting-您是正確的。可能是可用RAM(系統重新啟動後重新啟動,運行的應用程序最少)+ SSD(和同一磁盤上的文件)+ OSX版本(Mojave)+ UE版本(最新版本)的組合。如果系統磁盤是金屬的(我的Mac磁盤之一具有5400 RPM金屬磁盤),則可以通過將文件複製到UHSII 128GB SD卡來更好地分析該文件。
user2384366
2020-02-17 17:58:19 UTC
view on stackexchange narkive permalink

嘗試Glogg。在下載頁面上有一個MacOs版本:

https://glogg.bonnefon.org/download.html

我不知道約80 GB的文件,但我regularly使用它(在Windos上)打開了高達5 GB的日誌文件,並且對那些文件(索引建立後的內存佔用約為100-150MB,並進行搜索)非常有效是very快速)。

儘管有一個註釋-它是只讀分析器,而不是編輯器。

打開文件花了將近一個小時(顯示一個進度條,讓我知道它並沒有簡單地被鎖定),但是它打開了它,允許我滾動和搜索它,這使我直接找到了問題(顯然是緊密循環)。
哦,這正是我所要考慮的只讀分析器,特別是考慮到它允許我將相關行複製到更易於管理的文檔中,因此特別有用。
另一件事:如果要檢查大量文件,需要花費很多時間才能打開,則最好先進入“首選項”,然後禁用“加載上一個會話”。
@hbquikcomjamesl感謝您提供信息!很高興知道Glogg可以處理這樣的龐然大物。
Harper - Reinstate Monica
2020-02-18 00:35:21 UTC
view on stackexchange narkive permalink

你不會

即使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永久填充。那裡有完整的編程語言。面向對象的一切。

我是perl的忠實擁護者,但是如果您只想文件的結尾,`tail -c `可能會容易得多:-)
@jcaron當然,如果您的需求到此為止。正如我所討論的。但是什麼時候您的需求會停在那裡?
Curt
2020-02-18 17:30:31 UTC
view on stackexchange narkive permalink

一個大文件大概有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。

“小”不會是成功的故事。我剛剛用〜1.1 GB的日誌文件進行了嘗試。它消耗了所有可用內存,並花了大約5分鐘時間才中斷了它。為了檢測重複項而在文件中為每一行創建哈希的工具必定會失敗。
期望它只需要存儲唯一標識簽名字符串的哈希表,而不是每行一次掃描文件。條目的數量應不大於寫入日誌的程序中唯一的printf的數量,通常為數百個。“ petit”可能不是一個很好的實現,我承認我只用30MB的日誌文件嘗試過。我自己寫了,將更新答案。
little_birdie
2020-02-17 20:18:57 UTC
view on stackexchange narkive permalink

“ joe”,又名Joe自己的編輯器,旨在僅根據需要加載文件的一部分。我從未在過大的文件上使用過它,但從未遇到過太大而無法打開的text.file。

Alex
2020-02-20 00:32:27 UTC
view on stackexchange narkive permalink

絕對是妖魔。它不使用RAM打開文件。它只是從磁盤讀取。性能絕對令人難以置信。我之前已經檢查過500GB的密碼轉儲。

https://ridiculousfish.com/hexfiend/

Tom Tran
2020-02-18 20:35:21 UTC
view on stackexchange narkive permalink

打開終端並使用vim打開它

  vim filename.txt
 

P / s:

輸入vim並將文件拖到終端。然後按Enter。

要退出vim(不進行編輯):

 :q!
 
如何處理問題中描述的大小的文件?
最好使用`vim -r`以避免創建巨大的交換文件。
我不確定人們是否會理解`:q!`。您直接輸入並不是全部。
Panos Kordis
2020-02-19 15:29:30 UTC
view on stackexchange narkive permalink

我建議使用崇高文字。儘管它需要許可證,但可以免費下載和評估它,而沒有時間或功能限制。這意味著您或您的公司可以根據需要隨意嘗試。我個人使用它來調查大多數情況下甚至3-4GB的日誌,甚至12GB的SQL轉儲。初次打開時,它確實會遍歷整個文件以執行第一級索引等操作,但是它帶有一個進度條,用於指示整個過程的進度。

您是否有使用Sublime Text打開83GB文件的個人經驗?積極的個人經歷?您的答案僅提及幾乎小一個數量級的文件。
不,這就是為什麼我建議嘗試對其進行評估以評估其適用性。從我的個人經驗來看,我可以處理最大12GB的文件沒有問題,而且該應用程序的局限性也沒有提及max文件大小表示讀取任何大小的文件應該沒有問題。 OP對3件事感興趣:讀取文件,保持較低的內存使用量,不出現應用程序凍結的跡象。Sublime在建立索引時呈現進度條,特別適合於讀取和搜索大量文件時非常有用


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...