¿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?

Tobias Kienzler
fuente
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 )
hombre trabajando
fuente
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

Dom
fuente
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