如何禁用终端中的换行?


55

我需要使用bash shell查看大型日志文件。我以前是less用来打开文件的,但是由于行太长,所以有些行/自动换行正在进行。

由于文件是Log4J日志,并且每行的开头都有一个模式,因此,将行换行会使分析输出变得困难,因此我开始使用less -S长行斩波。

但是现在我需要使用tail -f,并且它还会换行输出。是否可以对所有命令禁用bash shell中的换行?

注意:有一个提到转义序列的不同问题的答案echo -ne '\e[?7l',但这似乎不适用于bash。


4
请注意,这与您选择的shell(bash)无关,但这取决于您选择的终端(xterm,Terminal,gnome-terminal,konsole等)。请参阅“终端”,“外壳”,“ tty”和“控制台”之间的确切区别是什么?
吉尔(Gilles)“所以,别再邪恶了”,

4
正如Gilles提到的,这是终端仿真器的问题。例如,在中screen,有一个“ wrap”命令。在中xterm,有一个-aw选项可以防止自动换行。其他终端仿真器可能有一些X资源。您正在使用什么模拟器?
Arcege 2011年

我正在使用gnome-terminal
nunaxe 2011年

1
@Arcege:实际上,这是+aw针对xterm:)的,但是,这解决了输出问题(例如,在ls -lTPB 上带有一堆Windows的长名称,效果很好),对于input,输入命令时,您可能仍然需要换行(或者,至少您不希望采用现在的方式+aw:尝试在“列边界”之后书写,然后回溯以查找巨大的GFX错误)。
伊曼纽尔·伯格

顺便说一句,似乎urxvtrxvt不能禁用换行。
伊曼纽尔·伯格

Answers:


7

您实际上是否需要tail -f或会less +F做些什么?由于听起来您仍然需要交互式寻呼机,所以在我看来,坚持起来less比自己重新实现要容易得多。

最后一点:您考虑过tail -f file | less吗?


我做了一些经验screenxterm那些仿真器也有选项,以防止线缠绕。但是截断行和隐藏行尾之间有很大的区别,因此我们可以根据需要查看它。使用tail -f file | less -S不是完美的,因为它似乎禁用了-f它,但这是我发现的最佳解决方案。
nunaxe

@鲍里斯·马科斯的答案也许更好。它less直接使用。
AnthonyD973

51

尝试:

less -S +F filename

  • Ctrlc停止拖尾,现在可以使用光标键左右移动。
  • 按下Shiftf以继续拖尾
  • Ctrlcq退出

这很棒!我的终端跨过两个屏幕,但是自从昨天阅读此内容以来,我只是将宽输出连接到less -S。在笔记本电脑上也非常有用。
JonatanÖström'18


15

假设您已COLUMNS定义变量,则可以执行

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

否则$COLUMNS,用终端的列宽代替,如所获得stty -a


2
$COLUMNS(不是立即更新SIGWINCH,仅在下一个提示符下才更新)和stty -a(难以在脚本中使用)的另一种替代方法是tput cols
manatwork 2011年

感谢enzotib。可以,但是会修剪线,我们看不到长线的末端。是否可以使cut行为像less -S缓冲长行一样,并且我们可以使用方向键看到完整的行?
nunaxe 2011年

嗯,不是那么简单。我认为有线解决方案例如是两个单独的screen窗口,每个窗口都有一个tail -f | cut或以某种方式模拟less行为的脚本。但目前尚无解决方案。
enzotib 2011年

1
旁注:剪切仅计数字节;不像less -S,它会弄乱彩色文本或任何带有ANSI转义符的东西。也可能搞砸Unicode。
ELLIOTTCABLE

是的,less -S对于彩色文本更有用。您可以使用less -S -E立即退出-对削减$ COLUMNS的彩色输出很有用。
2015年

4

您可以使用以下命令在Linux sun下禁用换行lesstail以及其他所有命令:

tput rmam

要恢复换行,请使用:

tput smam

3

终结器(http://software.jessies.org/terminator/)终端模拟器允许不换行并具有水平滚动(但用Java编写)。


如何启用它?默认情况下,它似乎不起作用。
2012年

在撰写本文时,默认情况下水平滚动处于打开状态。很棒的跨平台推荐。谢谢!
user7089 2013年

请通过展示如何启用此功能来使此答案更好。我已经在“偏好设置”中进行了搜索,但似乎找不到此选项。FWIW,我在跑步terminator v1.91
AnthonyK

2
@AnthonyK有两个不相关的终端仿真器,它们共享名称terminator这个名称是gentledevil所指的而您正在使用的那个
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

本页上有一些用-f ...尾部管道连接的示例,根据我的测试,它不能正常工作,如果您确实需要管道输送(例如,如果您需要管道输送更多的东西,例如grep),则可以使用类似:

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

可能不是最好的性能,但是可以工作...否则,如果不需要额外的操作,则可以使用其他类似的方法:

less -S +F file.log

2

这个问题有很多评论。OP的问题

但是现在我需要使用tail -f,并且它还会换行输出。是否可以对所有命令禁用bash shell中的换行?

有人对自动换行功能发表了一些评论,指出并非所有终端都具有自动换行功能。也许。但是(除了终止符(其开发人员没有提供终端描述的文档),给出的所有示例都是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真正在寻找的是一组可以禁止行换行的工具,尤其是用于查看日志文件的工具。如果终端能够很好地用于一般用途,则与终端内使用的工具的选择无关。

有寻呼机可以做到需要什么,例如,multitail其中列出了其功能

可以关闭换行,然后可以使用光标键向左/向右滚动

基于ncurses,它应该在任何引用的终端上运行。


1

内部vi类型

:set nowrap

我相信还有一个vi插件,可以让您像行为一样尾巴。


-1

如果您真的想查看完整的行,则可以将文本复制并粘贴到Atom或Notepad ++之类的文本编辑器中,并在其中禁用换行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.