¿Cómo deshabilitar el ajuste de línea en una terminal?

55

Necesito ver archivos de registros grandes usando un shell bash. Estaba usando lesspara abrir los archivos, pero como las líneas son demasiado largas, hay algún tipo de ajuste de línea / palabra.

Como los archivos son registros de Log4J, y hay un patrón al comienzo de cada línea, tener líneas ajustadas hace que sea difícil analizar la salida, así que comencé a usar less -Squé líneas largas.

Pero ahora necesito usar tail -f, y también la línea envuelve la salida. ¿Es posible deshabilitar el ajuste de línea en un shell bash para todos los comandos?

Nota: hay una respuesta a una pregunta diferente que menciona la secuencia de escape echo -ne '\e[?7l', pero parece que no funciona en bash.

nunaxe
fuente
44
Tenga en cuenta que esto no está relacionado con su elección de shell (bash), pero puede depender de su elección de terminal (xterm, Terminal, gnome-terminal, konsole, ...). Consulte ¿Cuál es la diferencia exacta entre un 'terminal', un 'shell', un 'tty' y una 'consola'?
Gilles 'SO- deja de ser malvado'
44
Como Gilles mencionó, es una cuestión del emulador de terminal. Por ejemplo, en screen, hay un comando de "ajuste". En xterm, hay una -awopción para evitar ajustes de línea automáticos. Probablemente hay algunos recursos X para otros emuladores de terminal. ¿Qué emulador estás usando?
Arcege
Estoy usando gnome-terminal.
nunaxe
1
@Arcege: En realidad, es +awpara xterm:) Pero, esto resuelve el problema de la salida (por ejemplo, ls -lcon un montón de nombres largos de Windows de TPB, funciona bien), para la entrada , al ingresar un comando, probablemente todavía desea envolver (o, al menos, no lo quiere como está ahora +aw: intente escribir más allá del "borde de la columna" y luego retroceda para un gran error GFX).
Emanuel Berg el
Por cierto, parece que urxvtni rxvtpuede ni puede deshabilitar los ajustes de línea.
Emanuel Berg el

Respuestas:

7

¿Realmente necesitas tail -fo quieres hacer algo less +F? Como parece que todavía quieres un localizador interactivo, me parece que sería mucho más fácil seguirlo lessque reimplementarlo tú mismo.

Una nota final: ¿has considerado tail -f file | less?

jw013
fuente
Hice algunas experiencias con screeny xtermcomo esos emuladores tienen opciones para evitar cambios de línea. Pero hay una gran diferencia entre truncar la línea y ocultar la cola de la línea para que podamos verla si queremos. El uso tail -f file | less -Sno es perfecto ya que parece deshabilitarlo, -fpero es la mejor solución que encontré.
nunaxe
La respuesta de @Boris Marcos es quizás mejor. Se usa lessdirectamente.
AnthonyD973
51

Tratar:

less -S +F filename

  • Presione Ctrlcpara detener el seguimiento y ahora puede moverse hacia la izquierda y hacia la derecha con las teclas del cursor.
  • Presione Shiftfpara reanudar el seguimiento
  • Prensa Ctrlc, qdejar de fumar
Boris Marcos
fuente
¡Esto es genial! He estado haciendo que mi terminal abarque dos pantallas, pero desde que leí esto ayer, simplemente canalizo la salida ancha less -S. También muy útil en la computadora portátil.
Jonatan Öström
16

Encontré una buena respuesta del superusuario , que funciona de forma inmediata para gnome-terminal, y probablemente también para otros terminales:

setterm -linewrap off

ingrese la descripción de la imagen aquí

Yuri Ghensev
fuente
15

Suponiendo que tiene la COLUMNSvariable definida, puede ejecutar

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

de lo contrario, sustitúyalo $COLUMNSpor el ancho de las columnas del terminal, tal como se obtiene con stty -a.

enzotib
fuente
2
Otra alternativa a $COLUMNS(no se actualiza de inmediato SIGWINCH, solo en el siguiente mensaje) y stty -a(más difícil de usar en el script) es tput cols.
manatwork
Gracias enzotib Eso funciona, pero recorta la línea y no podemos ver el final de las líneas largas. ¿Es posible hacer que se cutcomporte como less -Sdonde la línea larga está almacenada y podemos ver la línea completa usando las teclas direccionales?
nunaxe
Uhm, no es tan simple. Estoy pensando en soluciones cableadas como, por ejemplo, dos screenventanas separadas , cada una con una tail -f | cuto una secuencia de comandos que emula de alguna manera el lesscomportamiento. Pero no tengo una solución, por el momento.
enzotib
1
Nota al margen: cortar solo cuenta bytes; a diferencia less -S, se arruinará en texto coloreado, o cualquier cosa con escapes ANSI. También podría arruinar Unicode.
ELLIOTTCABLE
Sí, less -Ses más útil con texto en color. Puede usar less -S -Epara salir de inmediato, útil para cortar la salida de color en $ COLUMNS.
azulado
4

Puede desactivar el ajuste de línea para less, taily cualquier otro mando bajo el sol con Linux:

tput rmam

Para restaurar el uso del ajuste de línea:

tput smam
WinEunuuchs2Unix
fuente
3

El emulador de terminal terminator (http://software.jessies.org/terminator/) permite no ajustar líneas largas y tiene desplazamiento horizontal (pero está escrito en Java).

caballero
fuente
¿Cómo lo habilito? No parece funcionar por defecto.
defhlt
Al momento de escribir esto, el desplazamiento horizontal está activado por defecto. Gran recomendación multiplataforma. ¡Gracias!
user7089
Mejore esta respuesta mostrando cómo se habilitaría esta función. He buscado en Preferencias y parece que no puedo encontrar esta opción. FWIW, estoy corriendo terminator v1.91.
AnthonyK
2
@AnthonyK Hay dos emuladores de terminal no relacionados que comparten el nombre terminator, este al que se refiere gentledevil y el que está utilizando.
jlliagre
3

Dos buenas respuestas / ejemplos aquí

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)

Una advertencia: al menos en el terminal integrado en mi corte Mac no parece manejar muy bien los caracteres de tabulación. Parece que los muestra con, por ejemplo, 8 espacios, pero solo los calcula como 4 espacios de ancho o algo así. En otras palabras, si su terminal tiene 80 caracteres de ancho y su salida contiene varias pestañas por línea, debe establecer el ancho en quizás 60 o algo así. YMMV.

db
fuente
2

Use las siguientes opciones con less. Deshabilitará el ajuste de texto y preservará los colores del texto, si se especifica.

less -SR +F filename

Kamal Nayan
fuente
2

Hay algunos ejemplos en esta página con la cola de tubería con -f ... de mis pruebas no funciona correctamente, si realmente necesita tubería (por ejemplo, si necesita canalizar algo más, como grep) puede usar algo como :

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

probablemente no sea el mejor para el rendimiento, pero funciona ... de lo contrario, si no se requiere una pipa adicional, puede usar algo diferente como:

less -S +F file.log
nars
fuente
2

Hay muchos comentarios que se desvían de la pregunta. La pregunta de OP fue

Pero ahora necesito usar tail -f, y también la línea envuelve la salida. ¿Es posible deshabilitar el ajuste de línea en un shell bash para todos los comandos?

Se hicieron algunos comentarios sobre la función de autoenvoltura, indicando que no todos los terminales la tienen. Quizás. Pero (aparte del terminador , cuyos desarrolladores no documentan ninguna descripción de terminal ) todos los ejemplos dados fueron xterm, rxvt y algunos parecidos o descendientes. Esos están todos relacionados.

La +awopción en xtermcorresponde al autoWraprecurso. Consultando el manual, dice 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".

y en XTerm Control Sequences dice

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

que ciertamente no "depende de su elección de terminal", ya que cualquier terminal con compatibilidad VT100 admite la función. xterm y rxvt hacen esto, por ejemplo. Los otros también lo hacen.

Es discutible si la función sería útil para OP. La supresión del ajuste de línea es solo un aspecto del problema:

  • El shell conoce el ancho del terminal, pero eso se puede anular estableciendo COLUMNSun valor "grande".
  • Por supuesto, eso significa que las aplicaciones pasarán mucho tiempo escribiendo en el margen derecho (y algunas, si se equivocan, comenzarán una nueva línea de todos modos).
  • OP probablemente asumió que la aplicación se desplazaría hacia la izquierda / derecha para hacer que el terminal ancho sea utilizable. (Terminator hace esto, en parte, pero sus otros inconvenientes lo cancelan, excepto aquellos que solo usan el terminal para catingresar un archivo de registro en la pantalla).
  • lo que OP realmente está buscando es un conjunto de herramientas que se les puede decir que deshabiliten el ajuste de línea, especialmente para ver archivos de registro. Si el terminal funciona lo suficientemente bien para uso general, es irrelevante para la elección de las herramientas que se utilizan dentro del terminal.

Hay buscapersonas que pueden hacer lo que se necesita, por ejemplo, multitail que enumera en sus características

El ajuste de línea se puede desactivar, luego se puede desplazar hacia la izquierda / derecha con las teclas del cursor

Al estar basado en ncurses, debería funcionar en cualquiera de los terminales citados.

Thomas Dickey
fuente
1

vi

dentro del tipo vi

:set nowrap

Creo que también hay un complemento para vi que te dará un comportamiento similar al de la cola.

Jacques
fuente
-1

Si realmente desea ver las líneas completas, puede copiar y pegar el texto en un editor de texto como Atom o Notepad ++ y deshabilitar los ajustes de línea allí.

James Heazlewood
fuente