¿Cómo usar `cat` o` less` dependiendo del recuento de líneas?


12

Al mirar el contenido de los archivos, me gustaría catacortar automáticamente los archivos, pero lessaquellos que exceden el tamaño de la pantalla. Podría usar algo wc -l, pero ¿hay una mejor manera que tal vez también considere el tamaño de la ventana / cantidad actual de líneas disponibles?


1
Si bien muchas herramientas hacen esto, tenga en cuenta que rompe la expectativa. Es decir, el usuario no puede saber de antemano lo que sucederá. Encuentro esto molesto, por ejemplo, en el git logque hace esto exactamente. Nunca sabes de antemano qué vas a obtener (¿tienes que golpear q?).
bitmask

44
NOTA: en general, debe evitar usar catpara ver archivos. Por lo general, solo debe usar catpara enviar el contenido de un archivo a stdout para que pueda canalizarse a otro proceso. La razón para evitar el uso catpara la visualización es que envía los bytes sin procesar al terminal, lo que puede provocar que se ejecuten comandos inesperados del terminal (por ejemplo, algunos usuarios se atascaron cuando un archivo contenía los bytes correctos para desactivar el teclado del terminal) . Por lo general, debe usar un buscapersonas lesso un editor, que formateará caracteres especiales para su visualización para que el terminal no los interprete.
Chris Page

2
Si va a usar cat para ver el contenido del archivo directamente en el terminal, al menos úselo cat -vpara que escape caracteres especiales.
Chris Page

@bitmask buen punto, por eso pregunté ¿Es catposible la pantalla dividida ? cuál podría ser una mejor solución
Tobias Kienzler

@ChrisPage Mi teclado no murió, pero creo que he conseguido arruinar la página de códigos vez ... Gracias por apuntando cat -vhacia fuera
Tobias Kienzler

Respuestas:


9

Para darle la fórmula que involucra la wcverificación basada en:

(($(wc -l<input_file)<=$(tput lines))) && echo 'will fit' || echo 'not enough'

Hay una $LINESvariable de shell que también se puede usar:

(($(wc -l<input_file)<=LINES)) && echo 'will fit' || echo 'not enough'

Pero $LINESse actualiza solo cuando está en el símbolo del sistema. Para entender lo que quiero decir, ejecute esto y cambie el tamaño de la ventana de terminal durante el sleep:

( sleep 3; echo $LINES; tput lines )

Gracias, esto tiene la ventaja de que ya se puede ajustar para usar lesssi, por ejemplo, 2/3 de la pantalla fueron utilizados por cat.
Tobias Kienzler

20

Tal vez 'less -F file_to_read' es la opción: sale menos si la ventana es suficiente para mostrar todo el archivo, y espera en el localizador si no es el caso


suena bien, pero eso no genera nada en ese caso, y los códigos de salida son los mismos en ambos casos
Tobias Kienzler

Solo intento 'less -F / etc / passwd' y muestra el archivo correctamente (con o sin buscapersonas). Tienes razón, el código de retorno es 0 en ambos casos.
Dom

11
Ese comando funciona según lo solicitado, pero con un pequeño error: borra la pantalla después de mostrar el archivo. Agregar la -Xopción detendrá el borrado, por lo que los archivos cortos se mostrarán como lo cathace. Desafortunadamente, -Xla pantalla no se borrará ni después de mostrar archivos largos y desplazados.
manatwork

1
@manatwork eso es genial, gracias. No borrar la pantalla está realmente bien, ya que eso es lo que (no) sucedería si también se catles llamara
Tobias Kienzler
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.