В консоли 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", но для нормального вывода?
4 ответа
Поддержка отключения переноса строки зависит от терминала. Например, если вы используете screen
Вы можете нажать Ctrl-A Ctrl-R, чтобы переключить перенос строки.
В противном случае вы можете попробовать setterm -linewrap off
с увеличением числа терминальных столбцов или без stty
(не пробовал это).
Эмуляторы терминала, такие как PuTTY (если вы подключаетесь к серверу из коробки Windows), имеют свои настройки.
Если терминал поддерживает коды выхода VT, echo -ne "\x1b[7l"
отключит перенос экрана (echo -ne "\x1b[7h"
включит это).
Обратите внимание, что то, что работает в одном терминале, может не работать в другом - например, я сейчас нахожусь в окне PuTTY на Linux OpenSuSE 12.3 с bash, используя screen
: его последовательность управления работает отлично, а коды VT и термин - нет. На консоли текстового режима на более старой SuSE 11 (не GUI) последовательность VT работает (возможно screen
бы тоже), stty
видимо игнорируется.
Если вы не можете связываться со своим терминалом, вот быстрый сценарий, на который я сильно полагаюсь:
# 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
.
Этот сценарий предполагает, что каждый символ отображается с шириной, равной единице. Это неверно для экранированных символов, широких символов или символов нулевой ширины, поэтому, возможно, вы хотите удалить escape-последовательности ANSI или использовать мою полную версию trunc (скрипт Perl), который использует цвета, чтобы отметить, когда контент был усечен, и сохраняет цвета (их контрольные коды пропускаются при измерении ширины). Он также поддерживает
-m
для пропуска содержимого в середине.
Тогда создайте скрипт с именем nowrap...
some_command | теперь
Предлагаемый сценарий:-
#!/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
Я удивлен, что даже спустя 10 лет никто еще не упомянул, что (из 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