Como desativar quebra de linha em um terminal?

41

Eu preciso visualizar arquivos de logs grandes usando um shell bash. Eu estava usando less para 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 há um padrão no início de cada linha, ter linhas envolvidas dificulta a análise da saída, então comecei a usar less -S , que corta linhas longas.

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

Observação: há uma resposta para uma pergunta diferente que menciona a seqüência de escape echo -ne '\e[?7l' , mas parece não funcionar no bash.

    
por nunaxe 11.09.2011 / 11:39

11 respostas

6

Você realmente precisa de tail -f ou algo como less +F faz? Como parece que você ainda quer um pager interativo, parece-me muito mais fácil ficar com less do que reimplementar um.

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

    
por 11.09.2011 / 19:20
45

Tente:

less -S +F filename

  • Pressione Ctrl c para parar de seguir e agora Você pode mover para a esquerda e para a direita usando as teclas do cursor.
  • Pressione Shift f para retomar o recuo
  • Pressione Ctrl c , q para sair
por 13.12.2012 / 10:59
12

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

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

caso contrário, substitua $COLUMNS pela largura das colunas do terminal, conforme obtido por stty -a .

    
por 11.09.2011 / 13:22
4

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

    
por 12.09.2011 / 18:46
4

Finalmente encontrei uma boa resposta do superusuário , que funciona de maneira simples para gnome-terminal e, provavelmente, para outros terminais também:

setterm -linewrap off

    
por 16.02.2017 / 16:12
2

Duas boas respostas / exemplos aqui

link

tail -f logfile.log | cut -b 1-80

tail -f logfile.log | cut -b -$(tput cols)

Uma ressalva: pelo menos no terminal embutido no meu Mac corte não parece lidar com caracteres de guia muito bem. Parece que os exibe com, por exemplo, 8 espaços, mas calcula-os 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ê deve definir a largura para talvez 60 ou algo assim. YMMV.

    
por 18.11.2014 / 13:59
1

Use as opções abaixo com less . Ele desativará o quebra automática de palavras e preservará as cores do texto, se especificado.

less -SR +F filename

    
por 17.03.2016 / 11:45
1

Existem muitos comentários que se afastam da pergunta. A pergunta do OP foi

But now I need to use tail -f, and it also line wraps the output. Is it possible to disable line wrap in a bash shell for all the commands?

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

A opção +aw em xterm corresponde ao recurso autoWrap . Consultando o manual, 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 nas seqüências de controle do XTerm ele diz

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

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

Se o recurso seria útil para OP, é discutível. A supressão de quebra de linha é apenas um dos aspectos do problema:

  • O shell conhece a largura do terminal - mas isso pode ser substituído definindo COLUMNS como um valor "grande".
  • É claro que isso significa que os aplicativos gastarão muito tempo escrevendo na margem direita (e alguns, errando, iniciarão uma nova linha de qualquer maneira).
  • OP provavelmente assumiu que o aplicativo rolaria para a esquerda / direita para tornar o terminal amplo utilizável. (o terminador faz isso - parcialmente - mas seus outros inconvenientes cancelam isso, exceto aqueles que usam apenas o terminal para cat 'de um arquivo de log na tela).
  • o que o OP realmente está procurando é um conjunto de ferramentas que podem ser instruídas para desabilitar a quebra de linha, especialmente para exibir arquivos de log. Se o terminal funciona bem o suficiente para uso geral, é irrelevante para a escolha de ferramentas que se utiliza dentro do terminal.

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

Line wrapping can be switched off, after that one can scroll to the left/right with the cursor keys

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

    
por 17.03.2016 / 23:37
0

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

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

não é o melhor para o desempenho, provavelmente, mas funciona ... senão você pode usar algo diferente como:

less -S +F file.log
    
por 17.07.2017 / 00:05
0

vi

dentro do tipo vi

:set nowrap

Acredito que há também um plugin para o vi que lhe dará um comportamento semelhante.

    
por 06.09.2018 / 08:10
-1

Se você realmente quiser ver as linhas completas, copie e cole o texto em um editor de texto como o Atom ou o Notepad ++ e desabilite os envoltórios de linha.

    
por 15.07.2016 / 01:55

Tags