Как отключить перенос строки в терминале?


55

Мне нужно просматривать большие файлы журналов с помощью оболочки Bash. Я использовал lessдля открытия файлов, но так как строки слишком длинные, происходит какая-то перенос строки / слова.

Поскольку файлы представляют собой журналы Log4J, и в начале каждой строки есть шаблон, обернутые строки затрудняют анализ выходных данных, поэтому я начал использовать метод, less -Sкоторый прерывает длинные строки.

Но теперь мне нужно использовать tail -f, и это также строка переносит вывод. Можно ли отключить перенос строки в оболочке bash для всех команд?

Примечание: есть ответ на другой вопрос, в котором упоминается escape-последовательность echo -ne '\e[?7l', но он не работает на bash.


4
Обратите внимание, что это не связано с вашим выбором оболочки (bash), но может зависеть от вашего выбора терминала (xterm, Terminal, gnome-terminal, konsole,…). Смотрите Какова точная разница между терминалом, оболочкой, tty и консолью?
Жиль "ТАК - перестань быть злым"

4
Как упоминал Жиль, это вопрос эмулятора терминала. Например, в screen, есть команда "обернуть". В xterm, есть -awопция для предотвращения автоматического переноса строк. Вероятно, есть некоторые X-ресурсы для других эмуляторов терминала. Какой эмулятор вы используете?
Arcege

Я использую gnome-terminal.
nunaxe

1
@Arcege: На самом деле, это +awдля xterm:) Но это решает проблему для вывода (например, ls -lпри использовании набора длинных имен Windows из TPB, это работает нормально), для ввода при вводе команды вы, вероятно, все еще хотите обернуть (или, по крайней мере, вы не хотите, чтобы он был таким, какой он есть сейчас +aw: попробуйте написать за «границей столбца», а затем откатитесь назад для огромной ошибки GFX).
Эмануэль Берг

Кстати, похоже, ни отключить перенос строк, urxvtни rxvt
Эмануэль Берг

Ответы:


7

Вы действительно нуждаетесь tail -fили хотели бы что-то less +Fсделать Поскольку кажется, что вы все еще хотите интерактивный пейджер, мне кажется, что было бы намного легче придерживаться его, lessчем переопределять его самостоятельно.

Последнее замечание: вы рассматривали tail -f file | less?


Я получил некоторый опыт работы с этими эмуляторами, screenи у xtermних есть возможность предотвратить перенос строк. Но есть большая разница между усечением линии и скрытием ее конца, поэтому мы можем просмотреть ее, если захотим. Использование tail -f file | less -Sне является идеальным, так как кажется, что отключить, -fно это лучшее решение, которое я нашел.
nunaxe

@ Борис Маркос ответ, возможно, лучше. Он использует lessнапрямую.
AnthonyD973

51

Пытаться:

less -S +F filename

  • Нажмите, Ctrlcчтобы остановить хвост, и теперь вы можете перемещаться влево и вправо с помощью клавиш курсора.
  • Нажмите, Shiftfчтобы возобновить хвостохранилище
  • Нажмите Ctrlc, qчтобы выйти

Это здорово! У моего терминала два экрана, но так как я прочитал это вчера, я просто передал широкий вывод less -S. Также очень полезно на ноутбуке.
Джонатан Острём


15

Предположим, вы определили COLUMNSпеременную, вы можете выполнить

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

в противном случае $COLUMNSподставьте ширину столбцов терминала, полученную с помощью stty -a.


2
Другой альтернативой $COLUMNS(не обновляется сразу SIGWINCH, только в следующем приглашении) и stty -a(сложнее использовать в скрипте) является tput cols.
manatwork

Спасибо энзотиб. Это работает, но это урезает линию, и мы не можем видеть конец длинных линий. Можно ли заставить cutсебя вести себя так, как будто less -Sдлинная строка буферизована, и мы можем увидеть всю строку, используя клавиши со стрелками?
nunaxe

Хм, не все так просто. Я думаю о проводных решениях, как, например, о двух отдельных screenокнах, каждое из которых tail -f | cutимеет сценарий или эмулирует lessповедение. Но пока нет решения, на данный момент.
энзотиб

1
Примечание: вырезать только байты; в отличие от этого less -S, он собирается испортить цветной текст или что-нибудь с выходом ANSI. Может тоже испортить Unicode.
ELLIOTTCABLE

Да, less -Sболее полезно с цветным текстом. Вы можете использовать less -S -Eдля немедленного выхода - полезно для резки цветного вывода в $ COLUMNS.
голубоглазый

4

Вы можете отключить перенос строк для less, tailи любой другой команды под солнцем Linux с:

tput rmam

Чтобы восстановить перенос строки, используйте:

tput smam

3

Эмулятор терминала терминатора (http://software.jessies.org/terminator/) позволяет не переносить длинные строки и имеет горизонтальную прокрутку (но написана на Java).


Как мне это включить? Кажется, он не работает по умолчанию.
defhlt

На момент написания статьи горизонтальная прокрутка включена по умолчанию. Отличная кроссплатформенная рекомендация. Спасибо!
user7089

Пожалуйста, сделайте этот ответ лучше, показывая, как можно включить эту функцию. Я искал в настройках и не могу найти эту опцию. FWIW, я бегу terminator v1.91.
AnthonyK

2
@AnthonyK Есть два не связанных между собой эмулятора терминала terminator, которые имеют одно и то же имя : этот, на который ссылается гостья, и тот, который вы используете.
Jlliagre

3

Два хороших ответа / примеры здесь

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)

Одно предостережение: по крайней мере, на встроенном терминале на моем Mac Cut, кажется, не очень хорошо обрабатывает символы табуляции. Кажется, он отображает их, например, с 8 пробелами, но просто вычисляет их как 4 пробела в ширину или что-то в этом роде. Другими словами, если ваш терминал имеет ширину 80 символов и ваш вывод содержит несколько вкладок на строку, вы должны установить ширину, может быть, 60 или что-то подобное. YMMV.


2

Используйте ниже варианты с less. Это отключит перенос слов и сохранит цвета текста, если указано.

less -SR +F filename


2

На этой странице приведено несколько примеров с использованием -f ... из моих тестов это не работает должным образом, если вам действительно нужен конвейер (например, если вам нужно передать что-то большее, например, grep), вы можете использовать что-то вроде :

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

возможно, не самый лучший по производительности, но работает ... иначе, если не требуется дополнительная передача, вы можете использовать что-то другое, например:

less -S +F file.log

2

Есть много комментариев, которые отклоняются от вопроса. Вопрос ОП был

Но теперь мне нужно использовать tail -f, и это также строка переносит вывод. Можно ли отключить перенос строки в оболочке bash для всех команд?

Некоторые комментарии были сделаны по поводу функции автоматического переноса, заявив, что она есть не во всех терминалах. Может быть. Но (кроме терминатора , разработчики которого не описывают описание терминала ), все приведенные примеры были xterm, rxvt, а также похожими или потомками. Все это связано.

+awВариант в xtermсоответствует autoWrapресурсу. Обращаясь к руководству, он говорит, что

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

и в последовательностях управления XTerm это говорит

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

что, безусловно, не «зависит от вашего выбора терминала», поскольку любой терминал с VT100-совместимостью поддерживает эту функцию. xterm и rxvt делают это, например. Другие делают так же.

Вопрос о том, будет ли эта функция полезна для OP, спорен. Подавление переноса строк - это только один аспект проблемы:

  • Оболочка знает ширину терминала, но это можно переопределить, установив COLUMNS«большое» значение.
  • Конечно, это означает, что приложения будут тратить много времени на написание правого поля (а некоторые, если его неправильно, все равно начнут новую строку).
  • OP, вероятно, предполагал, что приложение будет прокручивать влево / вправо, чтобы использовать широкий терминал. (терминатор делает это - частично - но другие его недостатки отменяют это, за исключением тех, кто использует терминал только для вывода catфайла журнала на экран).
  • На самом деле OP ищет набор инструментов, которые могут отключить перенос строк, особенно для просмотра файлов журналов. Если терминал работает достаточно хорошо для общего использования, это не имеет отношения к выбору инструментов, которые используются в терминале.

Есть пейджеры, которые могут делать то, что нужно, например, многозадачный, который перечисляет в своих функциях

Перенос строки можно отключить, после чего можно перемещаться влево / вправо с помощью клавиш курсора.

Будучи основанным на ncurses, он должен работать на любом из указанных терминалов.


1

VI

внутри типа vi

:set nowrap

Я полагаю, есть также плагин для vi, который даст вам поведение, похожее на хвост.


-1

Если вы действительно хотите увидеть полные строки, вы можете скопировать и вставить текст в текстовый редактор, например Atom или Notepad ++, и отключить перенос строк.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.