Вопрос или проблема
Мне нужно просматривать большие файлы журналов с помощью оболочки bash. Я использовал less
для открытия файлов, но поскольку строки слишком длинные, происходит какая-то обертка строк/слов.
Поскольку файлы являются журналами Log4J, и в начале каждой строки есть шаблон, наличие обертки строк затрудняет анализ вывода, поэтому я начал использовать less -S
, который обрезает длинные строки.
Но теперь мне нужно использовать tail -f
, и он тоже оборачивает вывод. Возможно ли отключить обертку строк в оболочке bash для всех команд?
Примечание: существует ответ на другой вопрос, который упоминает последовательность escape echo -ne '\e[?7l'
, но похоже, что она не работает в bash.
Попробуйте:
less -S +F имя_файла
=
less --chop-long-lines +F имя_файла
А затем:
- Нажмите Ctrlc, чтобы остановить вывод и теперь вы можете перемещаться влево и вправо с помощью клавиш курсора.
- Нажмите Shiftf, чтобы возобновить вывод
- Нажмите Ctrlc, q, чтобы выйти
Руководство по less:
+
Если параметр командной строки начинается с +, то остальная часть этого параметра принимается как команда, которая будет выполнять less.
Например, +F
говорит less прокручивать вперед и продолжать пытаться читать, когда конец файла достигнут.
Нашел хороший ответ от суперпользователя, который работает сразу же для gnome-terminal
, а, вероятно, и для других терминалов:
setterm -linewrap off
Вы можете временно отключить обертку строк, введя эту команду:
tput rmam
Чтобы восстановить обертку строк, используйте эту команду:
tput smam
Предполагая, что у вас определена переменная COLUMNS
, вы можете выполнить
tail -f ваш-приложение.log | cut -c -$COLUMNS
в противном случае замените $COLUMNS
на ширину колонн терминала, как указано с помощью stty -a
.
Вам действительно нужен tail -f
или что-то вроде less +F
подойдет? Поскольку, похоже, вы все еще хотите интерактивный просмотрщик, мне кажется, что проще оставить less
, чем реализовывать один самостоятельно.
Последняя заметка: вы когда-нибудь думали о tail -f файл | less
?
Два хороших ответа/примера здесь
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.
Эмулятор терминала terminator (http://software.jessies.org/terminator/) позволяет не оборачивать длинные строки и имеет горизонтальную прокрутку (но написан на Java).
Есть много комментариев, которые отклоняются от вопроса. Вопрос автора заключался в следующем:
Но теперь мне нужно использовать
tail -f
, и он тоже оборачивает вывод. Возможно ли отключить обертку строк в оболочке bash для всех команд?
Некоторые комментарии касались функции автообертывания, утверждая, что не все терминалы имеют ее. Возможно. Но (кроме terminator, для которого разработчики не документируют описание терминала) все приведенные примеры были xterm, rxvt и некоторые подобные или производные. Все они связаны.
Опция +aw
в xterm
соответствует ресурсу autoWrap
. Изучая руководство, отмечается, что
autoWrap (class AutoWrap)
Определяет, следует ли включать автообертывание.
Это то же самое, что VT102 DECAWM. По умолчанию "true".
и в XTerm Control Sequences говорится
CSI ? Pm h
...
Установка привилегированного режима (DECSET).
Ps = 7 -> Режим обертки (DECAWM).
что определенно не “зависит от вашего выбора терминала”, поскольку любой терминал с совместимостью VT100 поддерживает эту функцию. Например, xterm и rxvt делают это. Другие тоже.
Однако полезность этой функции для автора спорна. Подавление обертки строк является лишь одним аспектом проблемы:
- Оболочка знает ширину терминала — но это можно переопределить, установив
COLUMNS
на “большое” значение. - Конечно, это означает, что приложения будут тратить много времени на запись на правом крае (и некоторые, ошибаясь, все равно начнут новую строку).
- Автор, вероятно, предполагал, что приложение будет прокручиваться влево/вправо, чтобы сделать широкий терминал удобным. (terminator делает это — частично — но его другие недостатки это отменяют, за исключением тех, кто использует терминал только для
cat
вывода файла журнала на экран). - На самом деле автор ищет набор инструментов, которым можно было бы сказать, чтобы отключить обертку строк, особенно для просмотра файлов журналов. Если терминал работает хорошо для общего использования, это не имеет значения для выбора инструментов, которые используются внутри терминала.
Существуют просмотрщики, которые могут сделать то, что нужно, например, multitail, который в своих функциях упоминает
Обертку строк можно отключить, после чего можно прокручивать влево/вправо с помощью клавиш курсора
Поскольку он основан на ncurses, он должен работать на любом из указанных терминалов.
Есть несколько примеров на этой странице, где используется pipe tail с -f … по моим тестам это не работает должным образом, если вам действительно нужен pipe (например, если вам нужно передать что-то большее, например grep), вы можете использовать что-то вроде:
watch -n 1 'tail -n $(($LINES-3)) файл.log | cut -c -$COLUMNS'
это, вероятно, не самый эффективный способ, но работает… в противном случае, если не требуется дополнительный pipe, вы можете использовать что-то другое, например:
less -S +F файл.log
Используйте следующие параметры с less
. Это отключит обертку слов и сохранит цвет текста, если он задан.
less -SR +F имя_файла
Мое текущее решение этой проблемы — использование lnav.
Это отличный инструмент для чтения логов. Он не будет оборачивать строки по умолчанию, позволяя вам перемещаться по всему журналу с помощью hjkl
и других клавиш vim, включая горизонтальную прокрутку. Он также автоматически продолжает (нажмите g
, чтобы перейти в низ и продолжить просмотр).
Просто передайте свой вывод в него:
cat mylog.log | lnav
vi
внутри vi введите
:set nowrap
Я верю, что есть также плагин для vi, который даст вам поведение, похожее на tail.
Если вы действительно хотите видеть полные строки, вы можете скопировать и вставить текст в текстовый редактор, например Atom или Notepad++, и отключить обертку строк там.
Ответ или решение
Чтобы отключить перенос строк в терминале и эффективно просматривать длинные журналы (например, файлы журналов Log4J), вы можете воспользоваться несколькими методами в зависимости от ваших требований и используемого терминала. Ниже приведены основные способы достижения этой цели:
1. Использование команды less
Команда less
предлагает отличный способ просмотра больших файлов без переноса строк. Чтобы использовать less
без переноса, выполните следующую команду:
less -S filename
- Опция
-S
(или--chop-long-lines
) гарантирует, что длинные строки будут обрезаны, а не переносятся на следующую строку.
Установка режима хвоста:
Если вам нужно следить за изменениями в файле журнала в режиме реального времени, вы можете использовать:
less -S +F filename
- Это сочетает изменение с функцией "хвост" (tail), позволяя вам следить за изменениями в файле, одновременно отключая перенос строк.
2. Использование команды tail
Для непосредственного просмотра файла журнала с отключенным переносом строк вы можете использовать комбинацию команд tail
и cut
:
tail -f your-app.log | cut -c -$(tput cols)
- Команда
cut -c -$(tput cols)
обрезает вывод до ширины вашего терминала, указанной переменной окруженияCOLUMNS
.
3. Временное отключение переноса строк
Если вы желаете временно отключить перенос строк в вашем терминале, воспользуйтесь следующими командами:
tput rmam
- Чтобы восстановить перенос строк, используйте:
tput smam
4. Использование других инструментов
Кроме стандартных утилит, вы можете рассмотреть различные инструменты для просмотра логов:
-
lnav: Это инструмент для просмотра журналов, который по умолчанию не обрезает строки и позволяет вам перемещаться по журналу с помощью Vim-подобных клавиш (
hjkl
). Команда для просмотра:cat mylog.log | lnav
-
multiTail: Этот инструмент позволяет следить за несколькими файлами одновременно с возможностью переключения между ними и отключением переноса строк.
5. Установка специализированного терминала
Некоторые терминалы, такие как Terminator, предлагают возможность отключения переноса строк и горизонтальной прокрутки. Это может быть удобным, если вы часто работаете с длинными строками и нуждаетесь в интуитивно понятном интерфейсе.
Заключение
Выбор метода зависит от конкретных задач и предпочтений. Если вам нужно просто просмотреть файл, стандартные команды less
и tail
с перехватом вывода могут быть всем, что вам нужно. Для более сложных потребностей рассмотрите использование специализированных инструментов для работы с логами.