Domanda:
Devo esaminare un file di testo da 82,7 GB (!). Cosa può aprirlo?
hbquikcomjamesl
2020-02-16 23:27:01 UTC
view on stackexchange narkive permalink

Di recente si è verificato un guasto di un server Tomcat, che ha prodotto un file di registro "catalina.out" da 82,7 GB, che ho salvato per l'analisi forense.

Quali editor di macOS possono aprire file di testo mostruosi senza consumare 80 GB di RAM o causare blocchi di 15 minuti?

Hai bisogno di leggere il file per sfogliarlo per dettagli o difetti interessanti o devi cercare il file?Il file ha un timestamp coerente?Le risposte seguenti sono tutte adatte, ma a 80 GB + dovresti considerare alcune analisi dei log e tecniche di ricerca per trovare i dati necessari per la tua analisi.Un esempio, ma fuori tema, la domanda è https://serverfault.com/questions/63297/good-free-tomcat-log-analyser
Vedi anche: https://askubuntu.com/questions/28847/text-editor-to-edit-large-4-3-gb-plain-text-file e https://vi.stackexchange.com/questions/149/how-can-i-open-very-large-files-with-good-performance
Sarebbe ragionevole scrivere un parser per il file che estrae i record e li aggiunge come righe in un database?I database sono progettati per ordinare e cercare in modo efficiente milioni di record;gli editor di testo non lo sono.
Tredici risposte:
79E09796
2020-02-17 18:01:34 UTC
view on stackexchange narkive permalink

less filename

Dalla riga di comando, ti consente di visualizzare i file immediatamente senza caricare l'intero file in memoria.

GNU less utilizza solo un valore predefinito di 64k di spazio di buffer quando visualizza un file arbitrariamente grande.Presumo che il meno in macos faccia lo stesso, quindi questa è un'ottima risposta.less ha anche la ricerca regex, ti consente di impaginare il file e molto altro ancora.
Questo è esattamente ciò per cui sono stati creati prima "more" e poi "less".Anche molti tasti di scelta rapida di navigazione.Il set di strumenti Unix è molto utile e vale la pena imparare.
@WayneConrad `less` non è un programma standard con implementazioni multiple;`less` * è * il paginatore GNU basato su` more`, ed è ciò che viene fornito con macOS.
+1 qui per semplicità, non è un editore come è stato chiesto, ma è super pragmatico e un po 'sepolto nella mia risposta.
Dubito che l'utente medio di macOS pensi troppo attentamente a cosa significa _editing_ quando usa comunque parole come _editor_.OP potrebbe benissimo significare solo _viewer_ o _pager_.+1
"L'ultima cosa che ricordo, stavo` ripristinando`'ing `| more` ..." Avere il mio +1!
"less" è "more"
Tim Seed
2020-02-17 16:08:01 UTC
view on stackexchange narkive permalink

Non proverei ad aprirlo ... preferisco farlo:

  1. grep - cerca del testo
  2. dividi: suddividi il file in blocchi da 10 MB.

Qualcosa come:

  grep "crash" My80GbFile.txt |Di Più
 

Se il file grande non è "Delimitato da riga"

  split -b 10M My80GbFile.txt
 

Ma se il file grande è solo un carico di righe, allora (come è stato pubblicato), diviso per riga (100.000 per sotto-file) in questo caso.

  split -l 100000 My80GbFile.txt
 
Potresti voler usare `grep -C5 crash` solo per avere poche righe di contesto sopra e sotto ogni corrispondenza.
Questo.* Non * aprire un file da 85 GB in un editor.Sbarazzati prima di tutto il fluff (senza compromettere il file originale, ovviamente).Se il file è di grandi dimensioni a causa del lungo tempo di registrazione, controllare l'ora vicino all'incidente.Se è grande perché è un'istantanea di un enorme stato del sistema, ad es.scarica un database o simile, prova a concentrarti sui dati rilevanti.
Se il file è composto da righe, invece di `split -b` sarebbe meglio fare` split -l`.Altrimenti, divideresti le linee a metà.
Suggerirei "grep" crash "My80GbFile.txt |less` invece di "grep" crash "My80GbFile.txt |more`, solo per facilitare la navigazione e l'uso della ricerca con il tasto `/`.
bmike
2020-02-17 00:36:20 UTC
view on stackexchange narkive permalink

In termini di esigenze immediate, il miglior editor visivo gratuito per macOS è BBEdit (collegato al download del Mac App Store) e fa così tanto: un vero concentrato di forza. Una volta ottenuto, puoi anche pagare per le funzionalità pro / automazione / senza gratitudine, ma è gratuito per sempre se lo desideri e ti piace quel prezzo.

Uso anche vi per modificare le cose, ma questo apre un barattolo di worm per aver bisogno della shell, dell'app terminale o di un'altra app e alcuni studiano per imparare come uscire dall'editor (tldr; prova ZZ o ZQ), personalizzalo e insegna al tuo cervello a pensare di operare sul testo in astratto invece di usare il mouse per selezionare gli elementi. Inoltre, un cercapersone come less o more o bat è anche molto amichevole per iniziare e navigare in file di grandi dimensioni. (E bat ti offre ali colori fantastici e consapevolezza della sintassi).

  brew install bat
 

Nel tuo caso, potrebbe valere la pena guardare anche l'app per console fornita con macOS se puoi utilizzare la funzionalità di ricerca. Avvia l'app da Spotlight e trascina il tuo file mostro sulla finestra per dare un'occhiata.

+1 per BBEdit: il team di BareBones ha ottimizzato specificamente questa app per gestire file di testo di grandi dimensioni nel corso degli anni.
Si prega di aggiungere se questo editor può effettivamente aprire un file di registro "catalina.out" 82.7G.E se richiede 85 GB di RAM.
@reinierpost La probabilità che qualcuno abbia un enorme file di registro in giro è scarsa.Non sono sicuro che nessuno, tranne il richiedente, possa confermarlo adeguatamente.
@T.J.L.Non ha bisogno di essere confermato.È affermato proprio lì nella domanda.Una risposta dovrebbe rispondere alla domanda posta.
Vim su Linux può essere utilizzato per modificare file molto grandi, ma è necessario sapere come farlo prima di provare ad aprirli e potrebbe essere necessario disabilitare i plugin, ecc;https://stackoverflow.com/questions/908575/how-to-edit-multi-gigabyte-text-files-vim-doesnt-work Presumo che mac os sia una storia simile.Non lo consiglierei davvero nonostante vim sia il mio editor di testo di riferimento.
@T.J.L.[Bias di conferma] (https://en.wikipedia.org/wiki/Confirmation_bias) Più voti positivi ottengono, più voti positivi riceveranno in futuro.Inoltre, sono un "moderatore di reputazione 181K" di _apple_ SE.È un grosso pesce in un piccolo stagno.Non ho provato personalmente BBEdit, ma ho provato a usare "less" e "more" con file di grandi dimensioni, e non sono una buona idea, a meno che non ti piaccia aspettare mentre i programmi cercano i file."grep" è buono.`ag` (The Silver Surfer) è fantastico: non so di un file di testo da 82.7G (!), ma può trovare una stringa in tutti i file sul mio SSD da 128GB (!!) in meno di 60 secondi.
scusa, è stato goffamente messo, non volevo che suonasse irrispettoso e ora è troppo tardi per modificare: un modo migliore per dirlo sarebbe dire che questo tipo di domanda non è la normale tariffa standard dell'Apple SEe che non intendo gettare inavvertitamente diffamazioni sul buon nome di bmike.
Grazie @AaronF per il tuo suggerimento `ag` - è fantastico.Ordini di grandezza più veloci di grep (probabilmente perché ignora i file in `.gitignore` - ad esempio` node_modules / ** `) e presenta i risultati bene.
@AaronF: Il cercatore d'argento, non il surfista, giusto?
@AaronF non ha bisogno di scuse, ma ha accettato volentieri come è stato offerto.Adoro le domande su risposta / ambito / idoneità.Diamine, faccio +1 sulla risposta con meno dato che è così concisa.
Hobbamok
2020-02-17 16:02:10 UTC
view on stackexchange narkive permalink

Basta non (aprirlo come UN file)

C'è qualche motivo specifico per cui non puoi semplicemente suddividerlo in blocchi di circa 1 GB con uno script?

Sì, la ricerca e funzionalità simili ne risentiranno, ma sarà già il caso con un file da 80 GB.

Se hai punti di interruzione specifici nello script (giorni nel timestamp, messaggi di avvio / arresto) potresti anche dividerlo per quello.In questo modo probabilmente otterrai anche un significato aggiuntivo nel file.

Inoltre: una volta suddiviso, qualsiasi IDE decente (come IntelliJ IDEA o qualsiasi altro) ti fornirà funzionalità di ricerca sul testo.

[Attenzione: questo viene da un programmatore, quindi potrebbe non essere il tuo approccio o eccessivo, posso solo dire che alla fine FUNZIONerebbe, dovrai sapere se ne vale la pena]

jcaron
2020-02-18 00:18:04 UTC
view on stackexchange narkive permalink
  1. Usa less in una finestra di terminale. Ti mostrerà una pagina alla volta del file, caricherà solo quella quantità di memoria, quindi puoi navigare tra file multi-TB con esso se lo desideri.

    Probabilmente dovresti aggiungere l'opzione -n per impedire a less di tentare di calcolare i numeri di riga. Quindi:

      meno -n / percorso / a / file
     

    Ricorda che puoi digitare less -n (non dimenticare lo spazio finale) e trascinare il file dal Finder alla finestra Terminale per aggiungere il percorso a quel file.

  2. Dopo aver visualizzato il file in less , puoi:

    • naviga utilizzando le frecce su / giù, spazio (una pagina giù), b (una pagina indietro) ...
    • cerca utilizzando / . Puoi anche cercare le righe che non contengono un pattern con /! . La ricerca inversa utilizza ? . Ma tutte le ricerche eseguiranno la scansione dell'intero file. Meglio averlo su un SSD se lo fai spesso.
    • vai a una riga specifica nel file utilizzando <number> seguito da G (G maiuscola)
    • vai a una parte specifica del file utilizzando <number> seguito da % . Quindi 50% ti porterà al centro del file, 90% all'ultimo 10%, ecc.

Se il tuo file di log ha timestamp e sai quando vuoi guardare, l'approccio più rapido è:

  1. apri il file
  2. Usa una "ricerca binaria" per trovare la parte approssimativa del file che ti interessa:

    • Digita 50% , che ti mostrerà la parte centrale del file
    • Se la parte che desideri è dopo, vai a 75% , altrimenti 25%
    • Ripeti finché non ti sei limitato alla parte pertinente
  3. Utilizza una ricerca normale (utilizzando / per andare avanti o ? per tornare indietro) per trovare la riga esatta che stai cercando (basata il timestamp esatto o una parola specifica che conosci mostra il problema).

Questo dovrebbe consentirti di navigare velocemente alla parte rilevante del file.


Se pensi di dover effettuare molte ricerche all'interno di un sottoinsieme del file, puoi in alternativa utilizzare grep con una specifica combinazione di data o data-ora (nel formato corretto) per prima estrarre quel sottoinsieme in un altro file più piccolo. Ad esempio, se sai che il crash si è verificato oggi un po 'dopo mezzogiorno mentre il tuo registro copre mesi, potresti

  grep '2020-02-17 12:' / path / to / file > extracted-log.txt
 

Questo ti darebbe tutte le righe che contengono un timestamp tra 12:00:00 e 12:59:59 inclusi. Ovviamente, il formato esatto dipenderà dal formato effettivo utilizzato per i timestamp.

grep eseguirà la scansione dell'intero file una volta per trovare tutte le righe pertinenti, il che richiederà un po 'di tempo su un file molto grande, ma poi avrai un file molto più gestibile.


Un'alternativa potrebbe essere quella di utilizzare dd per "estrarre" una parte del file originale, utilizzando offset e lunghezze che si trovano in less ( Ctrl-G per ottenere l'offset corrente). dd è uno strumento molto potente ma può essere molto pericoloso da usare, quindi usalo con cautela (e sicuramente non come root o con sudo se non sei sicuro al 100% di quello che stai facendo):

  dd if = / path / to / original / file of = destination_file.txt bs = 1 skip = <start offset> count = <length>
 

Nota che questo non è molto efficiente, è meglio usare una dimensione del blocco più grande ( bs ), idealmente una potenza di 2 come 1024, e dividere skip e count in base a quella dimensione del blocco.

Sono abbastanza sicuro che devono esserci altri strumenti che fanno lo stesso, anche se sto disegnando uno spazio vuoto.Penso che alcune versioni di cat possano farlo, ma a quanto pare non quella su macOS.

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

Con gli editor di testo basati su disco, il file non viene caricato interamente in memoria: ciò che vedi nell'interfaccia utente è un'anteprima dei contenuti che l'editor ha caricato in memoria.In passato ho utilizzato con successo UltraEdit per eseguire analisi di file di registro di grandi dimensioni.I suoi strumenti di ricerca basati su espressioni regolari e segnalibri di posizione sono particolarmente utili.Carica il file in modo rapido e puoi eseguire ricerche basate su espressioni regolari.L'URL ti porta a una pagina di download dove puoi scaricare una versione di prova di 30 giorni.Esistono anche altri editor di testo basati su disco.

Poiché sono passati alcuni anni, ho installato UltraEdit e ho aperto il file più grande che avevo.Era un file binario da 64 GB e si apriva immediatamente.Ho eseguito una ricerca di un termine e ci sono voluti circa 90 secondi.Ho evidenziato la dimensione del file con un rettangolo rosso in basso a destra.Il mac è un MBP 2018 con 8 GB di RAM che esegue Mojave.

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

sì, UltraEdit farà il trucco.Ma non "istantaneamente".Verrà agitato per 5-10 minuti su un file di quelle dimensioni :)
@jwenting Potresti essere sorpreso: UE è MOLTO bravo a gestire file di grandi dimensioni.
@MikeBrockington Lo so, uso UE.Ci sono voluti circa 5 minuti per aprire un dump SQL da 25 GB (che ha aiutato molto, nient'altro lo avrebbe aperto) che doveva essere cambiato per caricarlo su una macchina diversa poche settimane fa.
@jwenting - hai ragione.Potrebbe essere stata la combinazione di RAM disponibile (il sistema era appena stato riavviato, con app in esecuzione minime) + SSD (e il file sullo stesso disco) + Versione OSX (Mojave) + Versione UE (l'ultima).Se il disco di sistema è di metallo (uno dei miei Mac ha un disco di metallo da 5400 RPM), il file può essere analizzato meglio copiandolo su una scheda SD UHSII da 128 GB.
user2384366
2020-02-17 17:58:19 UTC
view on stackexchange narkive permalink

Prova Glogg.C'è una build MacOs nella pagina di download:

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

Non conosco file da 80 GB, ma io regularly lo ha usato (su Windos) per aprire file di registro fino a 5 GB e funziona benissimo su quelli (l'impronta di memoria dopo l'indicizzazione è di circa 100-150 MB e la ricercaè very veloce).

Una nota però: è un analizzatore di sola lettura, non un editor.

Ci è voluta quasi un'ora per aprire il file (mostrando una barra di avanzamento, per farmi sapere che non si era semplicemente bloccato), ma lo ha aperto, mi ha permesso di scorrerlo e cercarlo, e mi ha portato direttamente al problema(apparentemente un tightloop).
Oh, e un analizzatore di sola lettura era esattamente quello che avevo in mente, soprattutto perché mi ha permesso di copiare le righe pertinenti in un documento di dimensioni più gestibili.
Un'altra cosa: se si esaminano file enormi, che richiedono molti minuti per aprirsi, è probabilmente una buona idea andare prima in Preferenze e disabilitare "Carica ultima sessione".
@hbquikcomjamesl Grazie per le informazioni!È bello sapere che Glogg può gestire questi colossi.
Harper - Reinstate Monica
2020-02-18 00:35:21 UTC
view on stackexchange narkive permalink

Non lo faresti

Anche un fan di Tolkien non vuole 82,7 GB di nulla. Vuoi solo alcuni pezzi da quello; lo saprai quando lo vedrai.

E anche solo contemplare uno strumento che analizzi l'intero file è letteralmente una perdita di tempo; impiegheranno 15 minuti a leggere il file assumendo 100 MB / sec. Molto più lento se esegue analisi di qualsiasi complessità.

Terminal è tuo amico

Il salvavita qui è che OS X è costruito su Unix. Questa è stata una parte importante dell'acquisto di NeXT da parte di Apple e del ritorno di Steve Jobs. Ciò significa che puoi utilizzare l'intera suite di strumenti Unix, che sono estremamente ben rifiniti e molto ben supportati qui.

Ci sono dozzine di modi per farlo senza perl, ma poiché perl è integrato in MacOS ed è infinitamente estensibile, preferisco iniziare da lì (piuttosto che farlo in uno strumento più semplice, voglio migliorare un po 'la query, premi il limiti di quello strumento e doverlo ricreare in uno strumento diverso). Quindi qualcosa di simile in un file chiamato, dì "xx":

  $ len = -s "nomefile.log"; # variabile diventa la lunghezza del file
 open ($ IN, "<", "filename.log");
 cerca ($ IN, $ len - 10_000_000, 0); # perl consente _ in numeri per la leggibilità

 while (< $ IN>) {# <> legge una riga. La variabile predefinita è metavariabile $ _
   Stampa; # senza argomenti, il valore predefinito è metavariabile $ _
 }
 

Questo non leggerà l'intero file, cercherà semplicemente nella posizione specificata (10 MB dalla fine), quindi leggerà e stamperà tutto fino alla fine. Lo stamperà semplicemente sullo schermo, quindi per inviarlo al file, fallo quando lo chiami:

  perl xx > tailfile.txt
 

Ora hai un tailfile.txt da 10 MB che puoi aprire con qualcos'altro.

Ci sono modi più semplici per fare proprio questo , ma supponi di realizzare "Aspetta, voglio fare di più. Voglio solo errori e avvisi". Quindi modifichi il comando di stampa in

  print if / error / i o / warning / i;# // corrisponde al testo, il valore predefinito è $ _
 

Anche questo può essere ottenuto con strumenti più semplici se passi abbastanza tempo a fare il rooting attraverso i documenti.Ma poi, decidi che devi vedere le tre righe dopo l'errore.Proprio così ... hai superato gli strumenti più semplici, ma questo è banale in Perl.Puoi continuare a shimming Perl praticamente per sempre.C'è un linguaggio di programmazione completo lì dentro.Orientato agli oggetti e tutto.

Sono un grande fan di Perl, ma se vuoi solo la fine di un file, `tail -c ` è probabilmente molto più semplice :-)
@jcaron Certo, se le tue esigenze finiscono qui.Come ho discusso.Ma quando mai i tuoi bisogni finiscono qui?
Curt
2020-02-18 17:30:31 UTC
view on stackexchange narkive permalink

Un file così grande è probabilmente ridondante al 99,999999% (letteralmente), quindi la chiave è rimuovere le righe che ricorrono un'infinità di volte, con un certo grado di somiglianza, ed esaminare ciò che resta.

Su Linux c'è un'utilità chiamata petit , progettata per analizzare file di log enormi, che fa questo. Un esempio di utilizzo è petit --hash /var/log/kern.log . L'utilità può probabilmente essere trovata o creata per Mac.

Elabora ogni riga del file per rimuovere gli elementi che rendono la riga unica; ad esempio, elimina la data da ogni riga e sostituisci tutte le stringhe di cifre con un singolo carattere #. Ogni riga generica viene quindi sottoposta ad hashing per diventare un'impronta digitale per il rilevamento di linee simili.

Il risultato è che restituisce ogni riga solo una volta con un conteggio di occorrenze, riducendo notevolmente la dimensione dei dati. È probabile che qualsiasi cosa fuori dall'ordinario venga visualizzata chiaramente, quindi è possibile cercarla in modo specifico, utilizzando le utilità di alcune delle altre risposte qui.

Non so se questa particolare utilità sia sufficientemente performante per qualcosa di quella dimensione. Scommetto di sì, perché ha opzioni per tracciare grafici nell'ordine di mesi o anni di input e non avrebbe bisogno di memorizzare molto oltre a un piccolo numero di impronte digitali. Nel peggiore dei casi potresti scrivere il tuo: per ogni riga di input, genericalizzalo su un'impronta digitale, hash e aggiungilo a un database di hash + fingerprint + count, indicizzato da hash.

MODIFICA : petit sembra utilizzare più CPU e memoria di quanto desiderato, quindi ho scritto la mia semplice implementazione: https://github.com/curtmcd / hashlog. Fa un passaggio attraverso il file di registro; elabora a circa 6,5 ​​sec / GB sul mio server Ubuntu di casa.

"petit" non sarà una storia di successo.L'ho appena provato con un file di registro da ~ 1,1 GB.Ha consumato tutta la memoria disponibile e ci sono voluti circa 5 minuti prima che lo interrompessi.Uno strumento che crea un hash di ogni riga in un file per rilevare i duplicati è destinato a fallire in questa attività.
L'aspettativa è che sia necessario memorizzare solo una tabella hash di stringhe di firma univoche, non tutte le righe, scansionando il file una volta sola.Il numero di voci non dovrebbe essere molto superiore al numero di printf univoci nei programmi che scrivono nel log, tipicamente dell'ordine di centinaia.`petit` potrebbe non essere un'implementazione così eccezionale, e ammetto di averla provata solo con un file di registro da 30 MB.Ho scritto il mio e aggiornerò la risposta.
little_birdie
2020-02-17 20:18:57 UTC
view on stackexchange narkive permalink

"joe", alias Joe's Own Editor, è stato progettato per caricare solo parti del file secondo necessità.Non l'ho mai usato su un file così grande, ma non ho mai trovato un file di testo troppo grande per essere aperto.

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

Sicuramente Hex Fiend.Apre i file SENZA usare la RAM.Legge semplicemente dal disco.Le prestazioni sono assolutamente incredibili.Ho già esaminato i dump delle password da 500 GB con esso.

https://ridiculousfish.com/hexfiend/

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

Apri il terminale e usa vim per aprirlo

  nomefile vim.txt
 

P / s:

Digita vim e trascina il file sul tuo terminale.Quindi premi invio.

Per uscire da vim (senza modificare):

 : q!
 
Come funziona con un file delle dimensioni descritte nella domanda?
Meglio usare `vim -r` per evitare la creazione di enormi file di scambio.
Non sono sicuro che le persone sappiano come capire il file `: q!`.Non è del tutto ovvio che lo digiti direttamente.
Panos Kordis
2020-02-19 15:29:30 UTC
view on stackexchange narkive permalink

Suggerirei di utilizzare Sublime Text.Sebbene richieda una licenza, può essere scaricato e valutato gratuitamente senza limitazioni di tempo o funzionalità.Ciò significa che tu o la tua azienda potete avere la possibilità di provarlo quanto più e come volete.Io personalmente lo uso per indagare su log di forse anche 3-4 GB nella maggior parte dei casi, o dump SQL anche di 12 GB.All'apertura iniziale passa attraverso l'intero file per eseguire l'indicizzazione di 1 ° livello ecc., Ma viene fornito con una barra di avanzamento che indica l'avanzamento dell'intero processo.

Hai esperienza personale nell'utilizzo di Sublime Text per aprire un file da 83 GB?Esperienza personale positiva?La tua risposta menziona solo file di quasi un ordine di grandezza più piccoli.
No, ecco perché consiglio di provarlo per valutarne l'idoneità.Il fatto che dalla mia esperienza personale non ho avuto problemi a elaborare file fino a 12 GB e il fatto che i limiti dell'applicazione non menzionano nulla su max.la dimensione del file implica che non ci dovrebbero essere problemi nella lettura di un file di qualsiasi dimensione. L'OP è interessato a 3 cose: leggere il file, mantenere basso l'utilizzo della memoria, non ottenere segni di blocco dell'app.Sublime esegue il rendering di una barra di avanzamento durante l'indicizzazione ed è molto utile soprattutto per leggere e cercare file enormi


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...