Come disabilitare il ritorno a capo in un terminale?


55

Devo visualizzare file di log di grandi dimensioni usando una shell bash. Stavo usando lessper aprire i file, ma poiché le linee sono troppo lunghe c'è una sorta di avvolgimento di linee / parole in corso.

Poiché i file sono registri Log4J e c'è un modello all'inizio di ogni riga, avere le linee avvolte rende difficile analizzare l'output, quindi ho iniziato a usare less -Squali costolette per le lunghe righe.

Ma ora ho bisogno di usare tail -f, e anche la riga avvolge l'output. È possibile disabilitare il ritorno a capo in una shell bash per tutti i comandi?

Nota: c'è una risposta a una domanda diversa che menziona la sequenza di escape echo -ne '\e[?7l', ma sembra non funzionare su bash.


4
Si noti che questo non è correlato alla scelta della shell (bash), ma può dipendere dalla scelta del terminale (xterm, Terminal, gnome-terminal, konsole, ...). Vedi Qual è la differenza esatta tra un 'terminale', una 'shell', una 'tty' e una 'console'?
Gilles 'SO- smetti di essere malvagio' l'

4
Come menzionato da Gilles, si tratta dell'emulatore di terminale. Ad esempio, in screen, c'è un comando "a capo". In xterm, c'è -awun'opzione per prevenire il ritorno automatico delle linee. Probabilmente ci sono alcune risorse X per altri emulatori terminali. Quale emulatore stai usando?
Arcege,

Sto usando gnome-terminal.
nunaxe,

1
@Arcege: In realtà, lo è +awper xterm:) Ma questo risolve il problema per l' output (ad esempio, ls -lcon un mucchio di nomi Windows-ish lunghi da TPB, funziona bene), per l' input , quando si immette un comando, probabilmente è ancora vuoi andare a capo (o, almeno, non lo vuoi come è adesso +aw: prova a scrivere oltre il "bordo della colonna" e poi torna indietro per un enorme bug GFX).
Emanuel Berg,

A proposito, non sembra né urxvtrxvtpossibile disabilitare gli avvolgimenti di linea.
Emanuel Berg,

Risposte:


7

Hai davvero bisogno tail -fo vorresti less +Ffare qualcosa del genere ? Dal momento che sembra che tu voglia ancora un cercapersone interattivo, mi sembra che sarebbe molto più facile attenersi lessche reimplementarlo da solo.

Un'ultima nota: hai considerato tail -f file | less?


Ho fatto alcune esperienze con screene xtermpoiché quegli emulatori hanno opzioni per prevenire il ritorno a capo. Ma c'è una grande differenza tra troncare la linea e nascondere la coda della linea in modo che possiamo vederla se vogliamo. L'uso tail -f file | less -Snon è perfetto in quanto sembra disabilitare -fma è la migliore soluzione che ho trovato.
nunaxe,

La risposta di @Boris Marcos è forse migliore. Usa lessdirettamente.
AnthonyD973,

51

Provare:

less -S +F filename

  • Premi Ctrlcper fermare la coda e ora Puoi muoverti a destra e sinistra usando i tasti cursore.
  • Premere Shiftfper riprendere la coda
  • Premere Ctrlc, qper uscire

Questo è fantastico! Ho avuto il mio terminale su due schermi, ma da quando ho letto questo ieri ho appena convogliato l'ampio output a less -S. Molto utile anche sul laptop.
Jonatan Öström,


15

Supponendo di avere la COLUMNSvariabile definita, è possibile eseguire

tail -f your-app.log | cut -c -$COLUMNS

altrimenti sostituire $COLUMNScon la larghezza delle colonne del terminale, come ottenuto da stty -a.


2
Un'altra alternativa a $COLUMNS(non viene immediatamente aggiornata su SIGWINCH, solo al prossimo prompt) e stty -a(più difficile da usare nello script) è tput cols.
arte

Grazie enzotib. Funziona, ma taglia la linea e non siamo in grado di vedere la fine delle linee lunghe. È possibile fare in cutmodo che si comportino come nel punto in less -Scui è memorizzata la linea lunga e siamo in grado di vedere la linea completa usando i tasti direzionali?
nunaxe,

Uhm, non è così semplice. Sto pensando a soluzioni cablate come ad esempio due screenfinestre separate ciascuna con uno tail -f | cuto uno script che emula in qualche modo il lesscomportamento. Ma non ho una soluzione, al momento.
enzotib,

1
Nota a margine: tagliare conta solo i byte; a differenza less -S, rovinerà il testo colorato o qualsiasi altra cosa con escape ANSI. Potrebbe rovinare anche Unicode.
ELLIOTTCABLE

Sì, less -Sè più utile con il testo colorato. Puoi usarlo less -S -Eper uscire immediatamente - utile per tagliare stampe colorate a $ COLONNE.
azzurrato

4

È possibile disattivare la disposizione di riga per less, tailed ogni altro comando sotto il sole Linux con:

tput rmam

Per ripristinare il ritorno a capo utilizzare:

tput smam

3

L'emulatore di terminale (http://software.jessies.org/terminator/) consente di non avvolgere le linee lunghe e ha lo scorrimento orizzontale (ma è scritto in Java).


Come lo abilito? Non sembra funzionare di default.
defhlt

Al momento della stesura di questo, lo scorrimento orizzontale è attivo per impostazione predefinita. Ottima raccomandazione multipiattaforma. Grazie!
user7089

Per favore, migliora questa risposta mostrando come si abiliterebbe questa funzione. Ho cercato in Preferenze e non riesco a individuare questa opzione. FWIW, sto correndo terminator v1.91.
AnthonyK,

2
@AnthonyK Esistono due emulatori di terminale non correlati che condividono il nome terminator, quello a cui si riferisce gentledevil e quello che si sta utilizzando.
jlliagre,

3

Due buone risposte / esempi qui

http://www.commandlinefu.com/commands/view/1710/tail-a-log-file-with-long-lines-truncated

tail -f logfile.log | cut -b 1-80

tail -f logfile.log | cut -b -$(tput cols)

Un avvertimento: almeno sul terminale integrato sul mio taglio Mac non sembra gestire molto bene i caratteri di tabulazione. Sembra che li mostri ad esempio con 8 spazi, ma li calcola semplicemente come 4 spazi o qualcosa del genere. In altre parole, se il tuo terminale è largo 80 caratteri e il tuo output contiene diverse schede per riga, devi impostare la larghezza su forse 60 o qualcosa del genere. YMMV.


2

Utilizzare le opzioni seguenti con less. Disabiliterà il ritorno a capo automatico e manterrà i colori del testo, se specificato.

less -SR +F filename


2

Ci sono alcuni esempi in questa pagina piping tail con -f ... dai miei test non funziona correttamente, se hai davvero bisogno di piping (es. Se hai bisogno di pipe qualcosa in più, come grep) puoi usare qualcosa come :

watch -n 1 'tail -n $(($LINES-3)) file.log | cut -c -$COLUMNS'

probabilmente non è il massimo per le prestazioni ma funziona ... altrimenti, se non è richiesto alcun pipping aggiuntivo, è possibile utilizzare qualcosa di diverso come:

less -S +F file.log

2

Ci sono molti commenti che si discostano dalla domanda. La domanda di OP era

Ma ora ho bisogno di usare tail -f, e anche la riga avvolge l'output. È possibile disabilitare il ritorno a capo in una shell bash per tutti i comandi?

Sono stati fatti alcuni commenti sulla funzione autowrap, affermando che non tutti i terminali ce l'hanno. Forse. Ma (a parte terminator , i cui sviluppatori non documentano alcuna descrizione del terminale ) tutti gli esempi forniti erano xterm, rxvt e alcuni simili o discendenti. Quelli sono tutti correlati.

L' +awopzione in xtermcorrisponde alla autoWraprisorsa. Consultando il manuale, si dice che

   autoWrap (class AutoWrap)
           Specifies  whether  or  not  auto-wraparound should be enabled.
           This is the same as the VT102 DECAWM.  The default is "true".

e nelle sequenze di controllo XTerm dice

CSI ? Pm h
          ...
          DEC Private Mode Set (DECSET).
            Ps = 7  -> Wraparound Mode (DECAWM).

che certamente non "dipende dalla scelta del terminale", poiché qualsiasi terminale con compatibilità VT100 supporta la funzione. xterm e rxvt fanno questo, per esempio. Lo fanno anche gli altri.

È discutibile se la funzionalità sia utile per OP. La soppressione del ritorno a capo è solo un aspetto del problema:

  • La shell conosce la larghezza del terminale, ma può essere sovrascritta impostando COLUMNSun valore "grande".
  • Ovviamente ciò significa che le applicazioni impiegheranno molto tempo a scrivere sul margine destro (e alcune, sbagliando, avvieranno comunque una nuova riga).
  • OP probabilmente presupponeva che l'applicazione scorresse a sinistra / a destra per rendere utilizzabile il terminale largo. (il terminatore lo fa - in parte - ma gli altri suoi svantaggi lo annullano, tranne quelli che usano solo il terminale per catinviare un file di registro sullo schermo).
  • ciò che OP sta effettivamente cercando è un insieme di strumenti che possono essere detti per disabilitare il ritorno a capo, specialmente per visualizzare i file di registro. Se il terminale funziona abbastanza bene per un uso generale, è irrilevante per la scelta degli strumenti che si utilizzano all'interno del terminale.

Esistono cercapersone che possono fare ciò che è necessario, ad es. Multitail che elenca le sue caratteristiche

L'avvolgimento linea può essere disattivato, dopodiché è possibile scorrere verso sinistra / destra con i tasti cursore

Essendo basato su ncurses, dovrebbe funzionare su tutti i terminali citati.


1

VI

all'interno del tipo vi

:set nowrap

Credo che ci sia anche un plugin per vi che ti darà un comportamento simile alla coda.


-1

Se vuoi davvero vedere le linee complete, puoi copiare e incollare il testo in un editor di testo come Atom o Notepad ++ e disabilitare gli avvolgimenti di riga.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.