Jak wyłączyć zawijanie linii w terminalu?

55

Muszę przeglądać duże pliki dzienników za pomocą powłoki bash. Używałem lessdo otwierania plików, ale ponieważ linie są zbyt długie, trwa pewnego rodzaju zawijanie wierszy / słów.

Ponieważ pliki są dziennikami Log4J, a na początku każdej linii znajduje się wzorzec, zawijanie linii utrudnia analizowanie danych wyjściowych, więc zacząłem używać, less -Sktóre odcinają długie linie.

Ale teraz muszę użyć tail -f, a także linia otacza wyjście. Czy można wyłączyć zawijanie wiersza w powłoce bash dla wszystkich poleceń?

Uwaga: istnieje odpowiedź na inne pytanie, które wspomina sekwencję ucieczki echo -ne '\e[?7l', ale wydaje się, że nie działa na bash.

nunaxe
źródło
4
Zauważ, że nie ma to związku z twoim wyborem powłoki (bash), ale może zależeć od twojego wyboru terminala (xterm, Terminal, gnome-terminal, konsola,…). Zobacz, jaka jest dokładna różnica między „terminalem”, „powłoką”, „tty” i „konsolą”?
Gilles „SO- przestań być zły”
4
Jak wspomniał Gilles, jest to kwestia emulatora terminala. Na przykład w screenpoleceniu „zawiń”. W xterm, istnieje -awopcja, aby zapobiec automatycznej okłady linii. Prawdopodobnie istnieją pewne zasoby X dla innych emulatorów terminali. Z jakiego emulatora korzystasz?
Arcege
Używam gnome-terminal.
nunaxe
1
@Arcege: Właściwie to jest +awdla xterm:) Ale to rozwiązuje problem z danymi wyjściowymi (np. ls -lZ kilkoma długimi nazwami Windows z TPB, działa dobrze), dla wprowadzania , podczas wprowadzania polecenia, prawdopodobnie nadal chcesz zawijać (a przynajmniej nie chcesz, aby było tak, jak jest teraz +aw: spróbuj napisać poza „ramką kolumny”, a następnie cofnij się w poszukiwaniu ogromnego błędu GFX).
Emanuel Berg,
Nawiasem mówiąc, nie wydaje się ani urxvtnie rxvtmoże wyłączyć zawijania linii.
Emanuel Berg,

Odpowiedzi:

7

Czy naprawdę potrzebujesz tail -flub chciałbyś coś less +Fzrobić? Ponieważ brzmi to tak, jakbyś nadal chciał mieć interaktywny pager, wydaje mi się, że o wiele łatwiej byłoby się go trzymać lessniż samodzielnie go wdrożyć.

Ostatnia uwaga: czy zastanawiałeś się tail -f file | less?

jw013
źródło
Zrobiłem pewne doświadczenia z screeni xtermponieważ te emulatory mają opcje zapobiegania zawijaniu się linii. Ale istnieje duża różnica między obcięciem linii a ukryciem ogona linii, abyśmy mogli ją zobaczyć, jeśli chcemy. Używanie tail -f file | less -Snie jest idealne, ponieważ wydaje się, że wyłącza, -fale jest to najlepsze rozwiązanie, jakie znalazłem.
nunaxe
Odpowiedź Borisa Marcosa jest chyba lepsza. Używa lessbezpośrednio.
AnthonyD973
51

Próbować:

less -S +F filename

  • Naciśnij, Ctrlcaby zatrzymać śledzenie, a teraz możesz poruszać się w lewo i prawo za pomocą klawiszy kursora.
  • Naciśnij, Shiftfaby wznowić tailing
  • Naciśnij Ctrlc, qaby wyjść
Boris Marcos
źródło
To jest świetne! Mój terminal ma dwa ekrany, ale odkąd to wczoraj przeczytałem, po prostu przesyłam do niego szerokie wyjście less -S. Bardzo przydatny również na laptopie.
Jonatan Öström,
15

Załóżmy, że masz COLUMNSzdefiniowaną zmienną, możesz wykonać

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

w przeciwnym razie $COLUMNSzastąp szerokość kolumn terminalu, uzyskaną przez stty -a.

enzotib
źródło
2
Inną alternatywą dla $COLUMNS(nie jest od razu aktualizowana SIGWINCH, tylko przy następnym pytaniu) i stty -a(trudniejsze do użycia w skrypcie) jest tput cols.
manatwork,
Dzięki enzotib. To działa, ale przycina linię i nie jesteśmy w stanie zobaczyć końca długich linii. Czy można cutzachowywać się tak, jakby less -Sbuforowana była długa linia, a my możemy zobaczyć całą linię za pomocą klawiszy kierunkowych?
nunaxe
Uhm, nie takie proste. Myślę o rozwiązaniach przewodowych, takich jak np. Dwa osobne screenokna, z których każde tail -f | cutzawiera skrypt lub skrypt emulujący w pewien sposób lesszachowanie. Ale w tej chwili nie masz rozwiązania.
enzotib,
1
Uwaga dodatkowa: wycięcie liczy tylko bajty; w przeciwieństwie do tego less -S, to spieprzy kolorowy tekst lub cokolwiek z ucieczkami ANSI. Może też spieprzyć Unicode.
ELLIOTTCABLE
Tak, less -Sjest bardziej przydatny w przypadku kolorowego tekstu. Możesz użyć less -S -Edo natychmiastowego wyjścia - przydatne do cięcia kolorowych wydruków w $ COLUMNS.
niebieskawy
4

Można wyłączyć zawijanie liniowy less, taili każdą inną komendę pod słońcem Linux z:

tput rmam

Aby przywrócić zawijanie linii, użyj:

tput smam
WinEunuuchs2Unix
źródło
3

Emulator terminatora (http://software.jessies.org/terminator/) terminalu pozwala nie owijać długich linii i ma przewijanie w poziomie (ale jest napisany w Javie).

gentledevil
źródło
Jak mogę to włączyć? Domyślnie nie działa.
defhlt
W tym piśmie przewijanie w poziomie jest domyślnie włączone. Świetna, wieloplatformowa rekomendacja. Dzięki!
user7089
Popraw tę odpowiedź, pokazując, jak włączyć tę funkcję. Szukałem w Preferencjach i nie mogę znaleźć tej opcji. FWIW, biegnę terminator v1.91.
AnthonyK
2
@AnthonyK Istnieją dwa niepowiązane emulatory terminali o wspólnej nazwie terminator, ten, do którego odnosi się gentledevil, i ten, którego używasz.
jlliagre
3

Dwie dobre odpowiedzi / przykłady tutaj

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)

Jedno zastrzeżenie: przynajmniej na wbudowanym terminalu w moim komputerze Mac nie wydaje się zbyt dobrze obsługiwać znaków tabulacji. Wygląda na to, że wyświetla je np. Z 8 spacjami, ale po prostu oblicza je jako 4 spacje lub coś w tym rodzaju. Innymi słowy, jeśli twój terminal ma 80 znaków szerokości i twój wynik zawiera kilka zakładek w linii, musisz ustawić szerokość na 60 lub coś w tym rodzaju. YMMV.

db
źródło
2

Użyj poniższych opcji z less. Wyłączy zawijanie słów i zachowa kolory tekstu, jeśli jest to określone.

less -SR +F filename

Kamal Nayan
źródło
2

Na tej stronie jest kilka przykładów orurowania ogonem z opcją -f ... z moich testów nie działa ono poprawnie, jeśli naprawdę potrzebujesz orurowania (np. Jeśli potrzebujesz potokować coś więcej, na przykład grep), możesz użyć czegoś takiego :

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

prawdopodobnie nie najlepsza wydajność, ale działa ... w przeciwnym razie, jeśli nie jest wymagane dodatkowe pipowanie, możesz użyć czegoś innego:

less -S +F file.log
nars
źródło
2

Istnieje wiele komentarzy, które odbiegają od pytania. Pytanie OP brzmiało:

Ale teraz muszę użyć tail -f, a także linia otacza wyjście. Czy można wyłączyć zawijanie wiersza w powłoce bash dla wszystkich poleceń?

Poczyniono pewne komentarze na temat funkcji automatycznego zawijania, stwierdzając, że nie wszystkie terminale ją mają. Być może. Ale (oprócz terminatora , którego programiści nie udokumentowali żadnego opisu terminala ) wszystkie podane przykłady to xterm, rxvt i niektóre podobne lub potomne. Wszystkie są powiązane.

+awOpcja w xtermodpowiada autoWrapzasobu. Sprawdza instrukcję, mówi

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

aw Sekwencjach Kontroli XTerm jest napisane

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

co z pewnością nie „zależy od wyboru terminala”, ponieważ każdy terminal zgodny ze standardem VT100 obsługuje tę funkcję. xterm i rxvt robią to na przykład. Inni też.

To, czy funkcja będzie użyteczna dla OP, jest dyskusyjne. Tłumienie zawijania linii to tylko jeden aspekt problemu:

  • Powłoka zna szerokość terminala - ale można to zmienić, ustawiając COLUMNSna „dużą” wartość.
  • Oczywiście oznacza to, że aplikacje spędzą dużo czasu na pisaniu na prawym marginesie (a niektóre, błędnie, i tak zaczynają nową linię).
  • OP prawdopodobnie założył, że aplikacja będzie przewijać w lewo / w prawo, aby szeroki terminal był użyteczny. (terminator robi to - częściowo - ale jego inne wady to anulują, z wyjątkiem tych, którzy używają terminala tylko do catzapisywania pliku dziennika na ekranie).
  • to, czego OP faktycznie szuka, to zestaw narzędzi, o których można powiedzieć, aby wyłączały zawijanie linii, szczególnie do przeglądania plików dziennika. Jeśli terminal działa wystarczająco dobrze do ogólnego użytku, nie ma znaczenia wybór narzędzi używanych w terminalu.

Istnieją pagery, które potrafią zrobić to, co jest potrzebne, np. Multitail, który zawiera listę swoich funkcji

Zawijanie linii można wyłączyć, a następnie można przewijać w lewo / w prawo za pomocą klawiszy kursora

Będąc oparty na ncurses, powinien działać na każdym z wymienionych terminali.

Thomas Dickey
źródło
1

vi

wewnątrz typu vi

:set nowrap

Wierzę, że jest też wtyczka do vi, która da ci zachowanie podobne do ogona.

Jacques
źródło
-1

Jeśli naprawdę chcesz zobaczyć pełne linie, możesz skopiować i wkleić tekst do edytora tekstu, takiego jak Atom lub Notepad ++, i wyłączyć zawijanie linii.

James Heazlewood
źródło