Como desativar quebra de linha em um terminal?

55

Eu preciso exibir arquivos de logs grandes usando um shell bash. Eu estava usando lesspara abrir os arquivos, mas como as linhas são muito longas, há algum tipo de quebra de linha / palavra acontecendo.

Como os arquivos são logs do Log4J e existe um padrão no início de cada linha, ter linhas quebradas dificulta a análise da saída, então comecei a usar less -Squais linhas longas são cortadas.

Mas agora eu preciso usar tail -f, e também a linha envolve a saída. É possível desativar a quebra de linha em um shell bash para todos os comandos?

Nota: existe uma resposta para uma pergunta diferente que menciona a sequência de escape echo -ne '\e[?7l', mas parece não funcionar no bash.

nunaxe
fonte
4
Observe que isso não está relacionado à sua escolha de shell (bash), mas pode depender da sua escolha de terminal (xterm, Terminal, gnome-terminal, konsole,…). Consulte Qual é a diferença exata entre um 'terminal', um 'shell', um 'tty' e um 'console'?
Gilles 'SO- stop be evil'
4
Como Gilles mencionou, é uma questão de emulador de terminal. Por exemplo, em screen, existe um comando "wrap". Em xterm, existe uma -awopção para impedir a quebra automática de linha. Provavelmente, existem alguns recursos X para outros emuladores de terminal. Qual emulador você está usando?
Arcege
Eu estou usando gnome-terminal.
Nunaxe
11
@Arcege: Na verdade, é +awpara xterm:) Mas isso resolve o problema de saída (por exemplo, ls -lcom um monte de nomes longos do Windows para o TPB, funciona bem), de entrada , ao digitar um comando, você provavelmente ainda quer quebrar (ou, pelo menos, você não quer isso da maneira que está agora +aw: tente escrever além da "borda da coluna" e depois volte atrás para encontrar um grande erro de GFX).
Emanuel Berg
A propósito, parece que urxvtnem rxvtpode desativar a quebra de linha.
Emanuel Berg

Respostas:

7

Você realmente precisa tail -fou gostaria de algo assim less +F? Como parece que você ainda deseja um pager interativo, parece-me que seria muito mais fácil manter-se lessdo que reimplementá-lo.

Uma nota final: você já considerou tail -f file | less?

jw013
fonte
Eu fiz algumas experiências com screene xtermcomo esses emuladores têm opções para evitar quebra de linha. Mas há uma grande diferença entre truncar a linha e ocultar o final da linha para que possamos vê-la, se quisermos. O uso tail -f file | less -Snão é perfeito, pois parece desativar o -fmas é a melhor solução que encontrei.
Nunaxe
A resposta de @Boris Marcos é talvez melhor. Ele usa lessdiretamente.
AnthonyD973 18/03
51

Experimentar:

less -S +F filename

  • Pressione Ctrlcpara parar a cauda e agora Você pode mover para a esquerda e direita usando as teclas do cursor.
  • Pressione Shiftfpara retomar a cauda
  • Imprensa Ctrlc, qpara sair
Boris Marcos
fonte
Isso é ótimo! Estou tendo o meu terminal em duas telas, mas desde que li isso ontem, apenas canalizo a ampla saída less -S. Também é muito útil no laptop.
Jonatan Öström
16

Encontrei uma boa resposta do superusuário , que funciona gnome-terminalimediatamente e provavelmente para outros terminais:

setterm -linewrap off

insira a descrição da imagem aqui

Yuri Ghensev
fonte
15

Supondo que você tenha a COLUMNSvariável definida, você pode executar

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

caso contrário, substitua $COLUMNSpela largura das colunas do terminal, obtida por stty -a.

enzotib
fonte
2
Outra alternativa para $COLUMNS(não é atualizada imediatamente SIGWINCH, apenas no próximo prompt) e stty -a(mais difícil de usar no script) é tput cols.
manatwork
Obrigado enzotib. Isso funciona, mas apara a linha e não conseguimos ver o fim das longas filas. É possível fazer o cutcomportamento como less -Sonde a linha longa é armazenada no buffer e podemos ver a linha completa usando as teclas direcionais?
Nunaxe
Uhm, não é tão simples. Estou pensando em soluções com fio como, por exemplo, duas screenjanelas separadas , cada uma com tail -f | cutum script ou emulando de alguma forma o lesscomportamento. Mas não tem uma solução, no momento.
enzotib 11/09/11
11
Nota lateral: o corte conta apenas bytes; ao contrário less -S, ele vai estragar o texto colorido ou qualquer coisa com escape ANSI. Também pode estragar o Unicode.
ELLIOTTCABLE
Sim, less -Sé mais útil com texto colorido. Você pode usar less -S -Epara sair imediatamente - útil para cortar impressões coloridas em $ COLUMNS.
blueyed 13/05
4

Você pode desativar quebra de linha para less, taile todos os outros comandos sob o sol Linux com:

tput rmam

Para restaurar a quebra de linha, use:

tput smam
WinEunuuchs2Unix
fonte
3

O emulador de terminal terminator (http://software.jessies.org/terminator/) permite não quebrar linhas longas e possui rolagem horizontal (mas está escrito em Java).

gentledevil
fonte
Como eu o habilito? Parece não funcionar por padrão.
usar o seguinte comando
No momento da redação deste documento, a rolagem horizontal está ativada por padrão. Ótima recomendação para várias plataformas. Obrigado!
user7089
Por favor, melhore esta resposta mostrando como alguém habilitaria esse recurso. Pesquisei em Preferências e não consigo localizar esta opção. FWIW, eu estou correndo terminator v1.91.
AnthonyK 18/01
2
@AnthonyK Existem dois emuladores de terminal não relacionados que compartilham o nome terminator, este a que gentledevil está se referindo e o que você está usando.
jlliagre 11/02
3

Duas boas respostas / exemplos aqui

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)

Uma ressalva: pelo menos no terminal interno do meu Mac não parece lidar muito bem com os caracteres de tabulação. Parece que os exibe com, por exemplo, 8 espaços, mas apenas os calcula como 4 espaços de largura ou algo parecido. Em outras palavras, se o seu terminal tiver 80 caracteres de largura e sua saída contiver várias guias por linha, você deverá definir a largura para talvez 60 ou algo assim. YMMV.

db
fonte
2

Use as opções abaixo com less. Desabilitará a quebra de linha e preservará as cores do texto, se especificado.

less -SR +F filename

Kamal Nayan
fonte
2

Existem alguns exemplos nesta página canalizando cauda com -f ... dos meus testes, ele não funciona corretamente, se você realmente precisa de canalização (por exemplo, se você precisa canalizar algo mais, como grep), pode usar algo como :

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

provavelmente não é o melhor para o desempenho, mas funciona ... caso contrário, se não for necessário fazer um extra, você pode usar algo diferente, como:

less -S +F file.log
nars
fonte
2

Há muitos comentários que se desviam da questão. A pergunta do OP foi

Mas agora eu preciso usar tail -f, e também a linha envolve a saída. É possível desativar a quebra de linha em um shell bash para todos os comandos?

Alguns comentários foram feitos sobre o recurso de quebra automática, declarando que nem todos os terminais o possuem. Possivelmente. Mas (além do terminator , cujos desenvolvedores não documentam nenhuma descrição do terminal ), todos os exemplos dados foram xterm, rxvt e alguns semelhantes ou descendentes. Tudo isso está relacionado.

A +awopção em xtermcorresponde ao autoWraprecurso. Consultando o manual, ele diz que

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

e em XTerm Control Sequences diz

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

o que certamente "não depende da sua escolha de terminal", já que qualquer terminal com compatibilidade com o VT100 suporta esse recurso. xterm e rxvt fazem isso, por exemplo. Os outros também.

Se o recurso seria útil ao OP é discutível. Suprimir quebra de linha é apenas um aspecto do problema:

  • O shell sabe a largura do terminal - mas isso pode ser substituído por COLUMNSum valor "grande".
  • É claro que isso significa que os aplicativos gastam muito tempo escrevendo na margem direita (e alguns, errando, iniciarão uma nova linha de qualquer maneira).
  • O OP provavelmente supôs que o aplicativo rolaria para a esquerda / direita para tornar o amplo terminal utilizável. (o terminador faz isso - em parte -, mas seus outros inconvenientes cancelam isso, exceto aqueles que usam o terminal apenas para catinserir um arquivo de log na tela).
  • o que o OP realmente está procurando é um conjunto de ferramentas que podem ser instruídas para desativar a quebra de linha, especialmente para exibir arquivos de log. Se o terminal funcionar bem o suficiente para uso geral, é irrelevante para a escolha das ferramentas utilizadas no terminal.

Existem pagers que podem fazer o que é necessário, por exemplo, multitail que lista em seus recursos

A quebra de linha pode ser desativada, depois é possível rolar para a esquerda / direita com as teclas do cursor

Sendo baseado em ncurses, deve funcionar em qualquer um dos terminais citados.

Thomas Dickey
fonte
1

vi

dentro do tipo vi

:set nowrap

Eu acredito que também existe um plugin para o vi que lhe dará um comportamento semelhante ao da cauda.

Jacques
fonte
-1

Se você realmente deseja ver as linhas completas, copie e cole o texto em um editor de texto como Atom ou Notepad ++ e desabilite a quebra de linha.

James Heazlewood
fonte