在 Linux 控制台中,如何不换行输出

在 Linux 控制台中,如何不换行输出

在 (Linux) 终端中,有时查看行尾并不那么重要,但更重要的是不要弄乱行首。例如

line1 sddd dd ddd
line2 sdafss ss s
line 3 da aaaa aa 

而不是

line1 sddd dd ddd
dd dddd dd
line2 sdafss ss s
s ss
line 3 da aaaa aa 

有没有办法“剪切”或“隐藏”终端窗口末尾的行结尾,就像“less -S”一样,但用于正常输出?

答案1

换行禁用支持取决于终端。例如,如果使用,screen您可以点击Ctrl- A Ctrl-R来切换换行。

否则,您可以尝试setterm -linewrap off增加或不增加终端列的数量stty(还没有尝试过)。

终端仿真器(例如 PuTTY) (如果你从 Windows 机器连接到服务器) 具有他们自己的设置

如果终端支持VT 转义代码echo -ne "\x1b[?7l"将禁用屏幕换行(echo -ne "\x1b[?7h"将启用它)。

请注意,在一个终端中有效的东西可能在另一个终端中无效 - 例如,我现在在 Linux OpenSuSE 12.3 上的 PuTTY 窗口上使用 bash,使用screen: 其控制序列完美运行,而 VT 代码和术语则不行。在较旧的 SuSE 11(非 GUI)上的文本模式控制台上,VT 序列有效(可能screen也会有效),但stty显然被忽略了。

答案2

令我惊讶的是,即使过了 10 年,也没有人提到cut(来自 gnu coreutils)可以完全满足您的要求。只需将您的输出传输到cut

使用 55 列宽的终端窗口(只是为了证明这有效):

$ cat cutTest.txt # shows automatic folding/wrapping
Line 1 is too long, line 1 is too long, line 1 is too l
ong, yes line 1 is too long!
Line 2 is too long, line 2 is too long, line 2 is too l
ong, yes line 2 is too long!

$ cut -c-40 < cutTest.txt # cuts after 40 columns/characters
Line 1 is too long, line 1 is too long, 
Line 2 is too long, line 2 is too long, 

$ cat cutTest.txt | cut -c-40 # Using a pipe
Line 1 is too long, line 1 is too long, 
Line 2 is too long, line 2 is too long,

如果您的终端跟踪窗口宽度(确实如此bash),您可以使用以下命令在终端窗口末尾剪切“(按照原始问题):

$ cat cutTest.txt | cut -c-$COLUMNS
Line 1 is too long, line 1 is too long, line 1 is too l
Line 2 is too long, line 2 is too long, line 2 is too l

答案3

如果您不想弄乱您的终端,这里有一个我非常依赖的快速脚本:

# Truncate input(s) to the current terminal width
# Usage: trunc [-r] [FILE...]
trunc() {
  local B='^' A=
  if [ -z "$COLUMNS" ]; then COLUMNS="$(tput cols)"; fi
  if [ "$1" = '-r' ]; then shift; B= A='$'; fi
  expand "$@" |GREP_COLORS=ms= egrep -o "$B.{0,$COLUMNS}$A"
}

这会将制表符转换为空格expand,然后仅返回$COLUMNS标准输入或给定文件中文本的第一个零。它支持-r反转截断,因此您会看到最后的零到$COLUMNS字符。

(怎么做?grep -o“仅”显示匹配的内容。扩展的正则表达式^.{0,80}将仅匹配前 0-80 个字符,而.{0,80}$仅匹配最后 0-80 个字符。我使用这些范围来确保较短的行仍会显示出来。正则表达式是贪婪的,因此它们会匹配尽可能多的可用内容。)

您可以通过手动设置变量来更改截断的宽度$COLUMNS。例如,要截断为 72 个字符,请使用COLUMNS=72 trunc FILE

此脚本假设每个字符的显示宽度为 1。对于转义符、宽字符或零宽度字符,情况并非如此,因此您可能需要删除 ANSI 转义序列或使用我的完整版 trunc(perl 脚本),使用颜色来标记内容被截断的时间并保留颜色(测量宽度时会跳过它们的控制代码)。它还支持-m跳过中间的内容。

答案4

创建一个名为 nowrap 的脚本然后......

some_command | nowrap

建议脚本:-

#!/usr/bin/perl -w

my $cols=`/bin/tput cols`; chomp $cols;

while(<>){
  chompnl($_); my $tmp=$_; my $add=0;
  while($tmp=~/(.*?)(\033\[[\d\;]+m)(.*)/) {
    $add+=length($2) if(length($1)<$cols);
    $tmp=$1 . $3;
  }
  while($tmp=~/(.*?)\t(.*)/) {
    my $spc=8-(length($1) % 8);
    $tmp=$1 . ( ' ' x $spc ) . $2;
    $add-=($spc-1);
  }

  print substr($_,0,$cols+$add) . "\n";
}

# chomp() on unix doesn't eat "\r"...
sub chompnl {   # Warning: don't stuff up $1
  chop $_[0] while((substr($_[0],-1) eq "\015")||(substr($_[0],-1) eq "\012"));
} # chompnl

相关内容