Wie deaktiviere ich den Zeilenumbruch in einem Terminal?

55

Ich muss große Protokolldateien mit einer Bash-Shell anzeigen. Ich habe lessdie Dateien mit geöffnet, aber da die Zeilen zu lang sind, wird eine Art Zeilen- / Wortumbruch ausgeführt.

Da es sich bei den Dateien um Log4J-Protokolle handelt und sich am Anfang jeder Zeile ein Muster befindet, ist es schwierig, die Ausgabe zu analysieren, wenn Zeilen umbrochen werden. Daher habe ich begonnen, less -Slange Zeilen zu hacken.

Aber jetzt muss ich verwenden tail -f, und es bricht auch die Ausgabe zeilenweise um. Ist es möglich, den Zeilenumbruch in einer Bash-Shell für alle Befehle zu deaktivieren?

Hinweis: Es gibt eine Antwort auf eine andere Frage, in der die Escape-Sequenz erwähnt echo -ne '\e[?7l'wird, diese scheint jedoch bei bash nicht zu funktionieren.

Nunaxe
quelle
4
Beachten Sie, dass dies nicht mit Ihrer Wahl der Shell (bash) zusammenhängt, sondern von Ihrer Wahl des Terminals (xterm, Terminal, gnome-terminal, konsole,…) abhängen kann. Siehe Was ist der genaue Unterschied zwischen einem "Terminal", einer "Shell", einem "Tty" und einer "Konsole"?
Gilles 'SO - hör auf böse zu sein'
4
Wie Gilles erwähnt hat, handelt es sich um den Terminal-Emulator. Zum Beispiel screengibt es in einen "Wrap" -Befehl. In xtermgibt es eine -awOption, um automatische Zeilenumbrüche zu verhindern. Wahrscheinlich gibt es einige X-Ressourcen für andere Terminalemulatoren. Welchen Emulator benutzt du?
Arcege
Ich benutze gnome-terminal.
Nunaxe
1
@Arcege: Eigentlich ist es +awfür xterm:) Aber das löst das Problem für die Ausgabe (zB ls -lmit ein paar langen Windows-ish-Namen von TPB funktioniert es einwandfrei), für die Eingabe , wenn Sie einen Befehl eingeben, wahrscheinlich immer noch Sie möchten einen Zeilenumbruch (oder zumindest möchten Sie ihn nicht so haben, wie er jetzt ist +aw: Versuchen Sie, über die "Spaltengrenze" hinaus zu schreiben, und suchen Sie dann nach einem großen GFX-Fehler).
Emanuel Berg
Übrigens: Zeilenumbrüche können anscheinend weder deaktiviert urxvtnoch rxvtdeaktiviert werden.
Emanuel Berg

Antworten:

7

Brauchen Sie eigentlich tail -foder möchten Sie etwas less +Ftun? Da es sich so anhört, als ob Sie immer noch einen interaktiven Pager wünschen, scheint es mir viel einfacher zu sein, sich daran zu halten, lessals einen selbst neu zu implementieren.

Ein letzter Hinweis: Haben Sie darüber nachgedacht tail -f file | less?

jw013
quelle
Ich habe einige Erfahrungen mit screenund xtermals diese Emulatoren Optionen zum Verhindern von Zeilenumbrüchen gemacht. Es gibt jedoch einen großen Unterschied zwischen dem Abschneiden der Linie und dem Ausblenden des Endes der Linie, damit wir sie anzeigen können, wenn wir möchten. Das Verwenden tail -f file | less -Sist nicht perfekt, da es das zu deaktivieren scheint, -faber es ist die beste Lösung, die ich gefunden habe.
Nunaxe
@Boris Marcos 'Antwort ist vielleicht besser. Es nutzt lessdirekt.
AnthonyD973
51

Versuchen:

less -S +F filename

  • Drücken Sie Ctrlc, um das Tailing zu beenden. Jetzt können Sie sich mit den Cursortasten nach links und rechts bewegen.
  • Drücken Sie Shiftf, um das Tailing fortzusetzen
  • Drücken Sie Ctrlc, qum das Menü zu verlassen
Boris Marcos
quelle
Das ist toll! Habe mein Terminal zwei Bildschirme überspannt, aber seit ich das gestern gelesen habe, leite ich nur die breite Ausgabe an less -S. Auch sehr nützlich auf dem Laptop.
Jonatan Öström
15

Angenommen, Sie haben die COLUMNSVariable definiert, können Sie ausführen

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

andernfalls ersetzen Sie $COLUMNSmit der Spaltenbreite des Terminals, wie von erhalten stty -a.

Enzotib
quelle
2
Eine weitere Alternative zu $COLUMNS(wird nicht sofort aktualisiert SIGWINCH, sondern erst bei der nächsten Eingabeaufforderung) und stty -a(im Skript schwerer zu verwenden) ist tput cols.
Manatwork
Danke Enzotib. Das funktioniert, aber es schneidet die Linie und wir können das Ende der langen Linien nicht sehen. Ist es möglich, das cutVerhalten so zu gestalten, less -Sdass die lange Leitung gepuffert ist und wir die komplette Leitung mit den Richtungstasten sehen können?
Nunaxe
Ähm, nicht so einfach. Ich stelle mir verkabelte Lösungen als zwei separate screenFenster vor, die jeweils ein tail -f | cutoder ein Skript enthalten, das das lessVerhalten auf irgendeine Weise emuliert . Aber noch keine Lösung.
Enzotib
1
Randnotiz: Schneiden Sie nur die Anzahl der Bytes; Im Gegensatz dazu less -Swird es farbigen Text vermasseln oder irgendetwas mit ANSI-Escapezeichen. Könnte auch Unicode vermasseln.
ELLIOTTCABLE
Ja, less -Sist nützlicher bei farbigem Text. Mit können Sie less -S -Esofort beenden - nützlich zum Ausschneiden von Farbausgaben bei $ COLUMNS.
bläulich
4

Sie können Zeilenumbrüche für deaktivieren less, tailund alle anderen Befehl unter der Sonne Linux mit:

tput rmam

So stellen Sie den Zeilenumbruch wieder her:

tput smam
WinEunuuchs2Unix
quelle
3

Der Terminator-Emulator (http://software.jessies.org/terminator/) erlaubt es, keine langen Zeilen umzubrechen, und verfügt über einen horizontalen Bildlauf (ist jedoch in Java geschrieben).

Gentledevil
quelle
Wie aktiviere ich es? Es scheint nicht standardmäßig zu funktionieren.
29.
Zum jetzigen Zeitpunkt ist der horizontale Bildlauf standardmäßig aktiviert. Tolle plattformübergreifende Empfehlung. Vielen Dank!
user7089
Bitte machen Sie diese Antwort besser, indem Sie zeigen, wie man diese Funktion aktivieren würde. Ich habe in den Einstellungen gesucht und kann diese Option anscheinend nicht finden. FWIW, ich renne terminator v1.91.
AnthonyK
2
@AnthonyK Es gibt zwei unabhängige Terminalemulatoren den Namen teilen terminator, dieses die gentledevil bezieht sich auf und dass man die Sie verwenden.
11.
3

Zwei gute Antworten / Beispiele hier

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)

Eine Einschränkung: Zumindest beim eingebauten Terminal auf meinem Mac scheint cut mit Tabulatorzeichen nicht sehr gut zurecht zu kommen. Es sieht so aus, als würden sie mit z. B. 8 Leerzeichen angezeigt, aber sie werden einfach als 4 Leerzeichen breit oder so ähnlich berechnet. Mit anderen Worten, wenn Ihr Terminal 80 Zeichen breit ist und Ihre Ausgabe mehrere Tabulatoren pro Zeile enthält, müssen Sie die Breite auf 60 oder so ähnlich einstellen. YMMV.

db
quelle
2

Verwenden Sie die folgenden Optionen mit less. Der Zeilenumbruch wird deaktiviert, und die Textfarben werden beibehalten, sofern angegeben.

less -SR +F filename

Kamal Nayan
quelle
2

Es gibt ein paar Beispiele auf dieser Seite, in denen der Schwanz mit -f ... aus meinen Tests nicht richtig funktioniert. Wenn Sie wirklich Piping benötigen (z. B. wenn Sie mehr Piping benötigen, wie z. B. grep), können Sie etwas wie verwenden :

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

Wahrscheinlich nicht die beste Leistung, aber sie funktioniert. Andernfalls können Sie Folgendes verwenden, wenn kein zusätzliches Pipping erforderlich ist:

less -S +F file.log
nars
quelle
2

Es gibt viele Kommentare, die von der Frage abweichen. Die Frage von OP war

Aber jetzt muss ich verwenden tail -f, und es bricht auch die Ausgabe zeilenweise um. Ist es möglich, den Zeilenumbruch in einer Bash-Shell für alle Befehle zu deaktivieren?

Es wurden einige Kommentare zur Autowrap-Funktion abgegeben, die besagten, dass nicht alle Terminals über diese Funktion verfügen. Vielleicht. Aber (abgesehen von terminator , dessen Entwickler keine Terminalbeschreibung dokumentieren ) waren alle angegebenen Beispiele xterm, rxvt und einige ähnlich oder absteigend. Das sind alle miteinander verwandt.

Die +awOption in xtermentspricht der autoWrapRessource. In der Bedienungsanleitung steht, dass

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

und in XTerm Control Sequences heißt es

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

Dies hängt sicherlich nicht von der Wahl Ihres Terminals ab, da jedes Terminal mit VT100-Kompatibilität diese Funktion unterstützt. xterm und rxvt machen das zum Beispiel. Die anderen auch.

Ob die Funktion für OP nützlich wäre, ist umstritten. Das Unterdrücken von Zeilenumbrüchen ist nur ein Aspekt des Problems:

  • Die Shell kennt die Breite des Terminals - dies kann jedoch überschrieben werden, indem COLUMNSein "großer" Wert festgelegt wird.
  • Das bedeutet natürlich, dass Anwendungen viel Zeit damit verbringen, am rechten Rand zu schreiben (und einige, wenn man es falsch versteht, werden trotzdem eine neue Zeile beginnen).
  • Wahrscheinlich ging OP davon aus, dass die Anwendung nach links / rechts scrollen würde, um das Wide Terminal nutzbar zu machen. (terminator erledigt dies - teilweise - aber seine anderen Nachteile heben dies auf, mit Ausnahme derer, die das Terminal nur zum catAnzeigen einer Protokolldatei auf dem Bildschirm verwenden).
  • Was OP tatsächlich sucht, ist eine Reihe von Tools, mit denen der Zeilenumbruch deaktiviert werden kann, insbesondere zum Anzeigen von Protokolldateien. Wenn das Terminal für den allgemeinen Gebrauch gut genug funktioniert, ist es für die Auswahl der Werkzeuge, die innerhalb des Terminals verwendet werden, unerheblich.

Es gibt Pager, die das tun können, was benötigt wird, z. B. Multitail, das in seinen Funktionen aufgelistet ist

Zeilenumbruch kann ausgeschaltet werden, danach kann mit den Cursortasten nach links / rechts gescrollt werden

Da es auf ncurses basiert, sollte es auf jedem der genannten Terminals funktionieren.

Thomas Dickey
quelle
1

vi

innerhalb vi Typ

:set nowrap

Ich glaube, es gibt auch ein Plugin für vi, das dir schwanzartiges Verhalten verleiht.

Jacques
quelle
-1

Wenn Sie wirklich die vollständigen Zeilen sehen möchten, können Sie den Text kopieren und in einen Texteditor wie Atom oder Notepad ++ einfügen und dort Zeilenumbrüche deaktivieren.

James Heazlewood
quelle