Comment utiliser `cat` ou` less` selon le nombre de lignes?


12

Lorsque je regarde le contenu des fichiers, j'aimerais catraccourcir automatiquement les fichiers, mais lessceux qui dépassent la taille de l'écran. Je pourrais utiliser quelque chose avec wc -l, mais y a-t-il une meilleure façon de considérer la taille de la fenêtre / le nombre actuel de lignes disponibles?


1
Bien que de nombreux outils le fassent, notez que cela brise l'espérance. C'est-à-dire que l'utilisateur ne peut pas savoir à l'avance ce qui se passera. Je trouve cela ennuyeux par exemple dans git loglequel fait exactement cette chose. Vous ne savez jamais à l'avance ce que vous allez obtenir (devez-vous frapper q?).
bitmask

4
REMARQUE: en général, vous devez éviter d'utiliser catpour afficher des fichiers. En règle générale, vous ne devez utiliser que catpour envoyer le contenu d'un fichier à stdout afin qu'il puisse être redirigé vers un autre processus. La raison pour éviter d'utiliser catpour la visualisation est qu'il envoie les octets bruts au terminal, ce qui peut entraîner l'exécution de commandes de terminal inattendues (par exemple, certains utilisateurs se sont retrouvés bloqués lorsqu'un fichier contenait les bons octets pour désactiver le clavier du terminal) . Vous devez généralement utiliser un pager comme lessou un éditeur, qui formatera les caractères spéciaux pour les afficher afin qu'ils ne soient pas interprétés par le terminal.
Chris Page

2
Si vous allez utiliser cat pour afficher le contenu du fichier directement dans le terminal, utilisez-le au moins cat -vpour qu'il échappe aux caractères spéciaux.
Chris Page

@bitmask bon point, c'est pourquoi j'ai demandé Est-ce que le partage d'écran catest possible? ce qui pourrait être une meilleure solution
Tobias Kienzler

@ChrisPage clavier Ma n'a pas été tué, mais je pense que je réussi à bousiller la page de code une fois ... Merci de remarquer cat -vsur
Tobias Kienzler

Réponses:


9

Pour vous donner la formule qui implique la wcvérification basée sur:

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

Il existe une $LINESvariable shell qui peut également être utilisée:

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

Mais $LINESest mis à jour uniquement à l'invite de commande. Pour comprendre ce que je veux dire, exécutez ceci et redimensionnez la fenêtre du terminal pendant sleep:

( sleep 3; echo $LINES; tput lines )

Merci, cela a l'avantage de pouvoir être réglé pour utiliser lessdéjà si par exemple 2/3 de l'écran ont été utilisés par cat.
Tobias Kienzler

20

Peut-être que 'less -F file_to_read' est l'option: il quitte moins si la fenêtre est suffisante pour afficher tout le fichier, et attend sur le pager si ce n'est pas le cas


sonne bien, mais cela ne produit rien dans ce cas, et les codes de sortie sont les mêmes dans les deux cas
Tobias Kienzler

J'essaie simplement 'moins -F / etc / passwd' et il affiche correctement le fichier (avec ou sans pager). Vous avez raison, le code retour est 0 dans les deux cas.
Dom

11
Cette commande fonctionne comme demandé, mais avec un petit problème: elle efface l'écran après l'affichage du fichier. L'ajout de l' -Xoption arrêtera l'effacement, donc les fichiers courts seront affichés comme le catfait. Malheureusement, -Xl'écran ne sera pas effacé non plus après l'affichage de longs fichiers défilés.
manatwork

1
@manatwork c'est super, merci. Ne pas effacer l'écran est en fait correct, car c'est ce qui ne se passerait pas si caton l'appelait également
Tobias Kienzler
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.