Comment désactiver le retour à la ligne dans un terminal?

55

J'ai besoin d'afficher des fichiers journaux volumineux à l'aide d'un shell bash. J'utilisais lesspour ouvrir les fichiers, mais comme les lignes sont trop longues, il y a une sorte de retour à la ligne / mot en cours.

Étant donné que les fichiers sont des journaux Log4J et qu’il existe un motif au début de chaque ligne, il est difficile d’analyser la sortie après avoir été encapsulé. C’est pourquoi j’ai commencé à utiliser less -Sles lignes longues qui sont tronquées.

Mais maintenant, je dois utiliser tail -f, et la ligne est également renvoyée à la ligne. Est-il possible de désactiver le retour à la ligne dans un shell bash pour toutes les commandes?

Remarque: il existe une réponse à une question différente qui mentionne la séquence d'échappement echo -ne '\e[?7l', mais elle ne semble pas fonctionner avec Bash.

nunaxe
la source
4
Notez que cela n’a aucun rapport avec votre choix de shell (bash), mais peut dépendre de votre choix de terminal (xterm, Terminal, gnome-terminal, konsole,…). Voir Quelle est la différence exacte entre un "terminal", un "shell", un "tty" et une "console"?
Gilles 'SO- arrête d'être méchant'
4
Comme Gilles l'a mentionné, il s'agit de l'émulateur de terminal. Par exemple, dans screen, il existe une commande "wrap". Dans xterm, il existe une -awoption pour empêcher les retours à la ligne automatiques. Il existe probablement des ressources X pour d'autres émulateurs de terminaux. Quel émulateur utilisez-vous?
Arcege
J'utilise gnome-terminal.
nunaxe
1
@Arcege: En fait, c'est +awpour xterm:) Mais cela résout le problème de la sortie (par exemple, ls -lavec un tas de noms Windows-ish longs de TPB, cela fonctionne bien), pour la saisie , lorsque vous entrez une commande, vous avez probablement encore wrap wrap (ou, du moins, vous ne le voulez pas tel qu’il est actuellement +aw: essayez d’écrire au-delà de la "bordure de colonne" puis revenez en arrière pour un énorme bogue GFX).
Emanuel Berg
En passant, il semble que ni urxvtne rxvtpeut désactiver les retours à la ligne.
Emanuel Berg

Réponses:

7

Avez - vous réellement besoin tail -fou si quelque chose comme less +Ffaire? Comme il semble que vous souhaitiez toujours un téléavertisseur interactif, il me semble qu'il serait beaucoup plus facile de vous en tenir lessqu'à de le réimplémenter vous-même.

Une note finale: avez-vous envisagé tail -f file | less?

jw013
la source
J'ai fait quelques expériences avec screenet xtermcomme ces émulateurs ont des options pour empêcher les retours à la ligne. Mais il y a une grande différence entre tronquer la ligne et cacher la queue pour que nous puissions la voir si nous le voulons. L'utilisation tail -f file | less -Sn'est pas parfaite car elle semble désactiver le -fmais c'est la meilleure solution que j'ai trouvée.
nunaxe
La réponse de @Boris Marcos est peut-être meilleure. Il utilise lessdirectement.
AnthonyD973
51

Essayer:

less -S +F filename

  • Appuyez sur Ctrlcpour arrêter la queue et maintenant. Vous pouvez vous déplacer à gauche et à droite en utilisant les touches de curseur.
  • Appuyez sur Shiftfpour reprendre la queue
  • Appuyez sur Ctrlc, qpour quitter
Boris Marcos
la source
C'est bien! Avoir mon terminal s'étendre sur deux écrans, mais depuis que j'ai lu ceci hier, je dirige simplement la sortie large vers less -S. Aussi très utile sur l'ordinateur portable.
Jonatan Öström
15

Si vous avez COLUMNSdéfini la variable, vous pouvez exécuter

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

sinon, remplacez $COLUMNSpar la largeur des colonnes du terminal, obtenue par stty -a.

enzotib
la source
2
Une autre alternative à $COLUMNS(n'est pas immédiatement mise à jour SIGWINCH, uniquement à l'invite suivante) et stty -a(plus difficile à utiliser dans un script) est tput cols.
Manatwork
Merci enzotib. Cela fonctionne, mais cela coupe la ligne et nous sommes incapables de voir la fin des lignes longues. Est-il possible de se cutcomporter comme less -Ssi la longue ligne était mise en mémoire tampon et que nous pouvions voir la ligne complète à l'aide des touches directionnelles?
nunaxe le
Euh, pas si simple. Je pense aux solutions câblées comme par exemple deux screenfenêtres séparées avec chacune tail -f | cutun script ou un script imitant le lesscomportement. Mais ne pas avoir de solution, pour le moment.
enzotib
1
Note de côté: couper seulement compte octets; contrairement à less -Scela, il va bousiller du texte coloré, ou quoi que ce soit avec des fuites ANSI. Peut aussi bousiller Unicode.
ELLIOTTCABLE
Oui, less -Sest plus utile avec du texte coloré. Vous pouvez utiliser less -S -Epour quitter immédiatement - utile pour couper la sortie colorée à $ COLUMNS.
blueyed
4

Vous pouvez désactiver les changements de ligne pour less, tailet toute autre commande sous le soleil avec Linux:

tput rmam

Pour restaurer le retour à la ligne, utilisez:

tput smam
WinEunuuchs2Unix
la source
3

L'émulateur de terminal de terminateur (http://software.jessies.org/terminator/) permet de ne pas encapsuler de longues lignes et dispose d'un défilement horizontal (mais est écrit en Java).

gentledevil
la source
Comment puis-je l'activer? Cela ne semble pas fonctionner par défaut.
defhlt
A ce jour, le défilement horizontal est activé par défaut. Excellente recommandation multiplateforme. Merci!
user7089
S'il vous plaît rendre cette réponse mieux en montrant comment on pourrait activer cette fonctionnalité. J'ai effectué une recherche dans les préférences et n'arrive pas à localiser cette option. FWIW, je cours terminator v1.91.
AnthonyK
2
@AnthonyK Il existe deux émulateurs de terminaux indépendants qui partagent le nom terminator, celui auquel gentledevil fait référence et celui que vous utilisez.
Jlliagre le
3

Deux bonnes réponses / exemples ici

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)

Une mise en garde: au moins sur le terminal intégré sur mon Mac, couper ne semble pas gérer très bien les caractères de tabulation. Il semble que cela les affiche avec par exemple 8 espaces mais les calcule simplement comme 4 espaces larges ou quelque chose comme ça. En d'autres termes, si votre terminal a une largeur de 80 caractères et que votre sortie contient plusieurs onglets par ligne, vous devez définir la largeur sur 60 ou quelque chose comme ça. YMMV.

db
la source
2

Utilisez les options ci-dessous avec less. Il désactivera le retour à la ligne et préservera les couleurs du texte, si spécifié.

less -SR +F filename

Kamal Nayan
la source
2

Il y a quelques exemples sur cette page queue de tuyauterie avec -f ... D'après mes tests, cela ne fonctionne pas correctement. Si vous avez vraiment besoin de tuyauterie (par exemple, si vous avez besoin de quelque chose de plus, comme grep), vous pouvez utiliser quelque chose comme: :

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

Ce n’est probablement pas le meilleur pour la performance, mais ça marche ... sinon, si aucune extra pipping n'est requis, vous pouvez utiliser quelque chose de différent, comme:

less -S +F file.log
nars
la source
2

Beaucoup de commentaires s’écartent de la question. La question de OP était

Mais maintenant, je dois utiliser tail -f, et la ligne est également renvoyée à la ligne. Est-il possible de désactiver le retour à la ligne dans un shell bash pour toutes les commandes?

Certains commentaires ont été faits sur la fonctionnalité autowrap, déclarant que tous les terminaux ne l’ont pas. Peut-être. Mais (à part terminator , dont les développeurs ne documentent aucune description de terminal ), tous les exemples donnés étaient xterm, rxvt et certains sosies ou descendants. Ce sont tous liés.

L' +awoption dans xtermcorrespond à la autoWrapressource. En consultant le manuel, on dit 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".

et dans les séquences de contrôle XTerm, il est dit

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

ce qui ne dépend certainement pas de votre choix de terminal, car tout terminal compatible VT100 prend en charge cette fonctionnalité. xterm et rxvt font cela, par exemple. Les autres aussi.

Que la fonctionnalité soit utile à l'OP est discutable. Supprimer le retour à la ligne n'est qu'un aspect du problème:

  • Le shell connaît la largeur du terminal, mais vous pouvez le remplacer en définissant COLUMNSune valeur "grande".
  • Bien entendu, cela signifie que les applications passeront beaucoup de temps à écrire sur la marge de droite (et certaines, en se trompant, commenceront de toute façon une nouvelle ligne).
  • OP a probablement supposé que l'application ferait défiler vers la gauche / droite pour rendre le terminal large utilisable. (le terminateur fait ceci - en partie - mais ses autres inconvénients l’annulent, à l’exception de ceux qui n’utilisent le terminal que pour catafficher un fichier journal à l’écran).
  • Ce que l’OP cherche en réalité, c’est un ensemble d’outils permettant de désactiver le retour à la ligne, en particulier pour l’affichage des fichiers journaux. Si le terminal fonctionne assez bien pour une utilisation générale, le choix des outils que l’on utilise dans le terminal n’est pas pertinent.

Il y a des pagers qui peuvent faire ce qui est nécessaire, par exemple multitail , avec la liste de ses caractéristiques.

Le retour à la ligne peut être désactivé, après quoi on peut défiler vers la gauche / droite avec les touches du curseur

Étant basé sur des bourses, il devrait fonctionner sur l’un des terminaux cités.

Thomas Dickey
la source
1

vi

type vi à l'intérieur

:set nowrap

Je crois qu’il existe également un plugin pour vi qui vous donnera un comportement similaire à celui d’une queue.

Jacques
la source
-1

Si vous voulez vraiment voir les lignes complètes, vous pouvez copier et coller le texte dans un éditeur de texte comme Atom ou Notepad ++ et désactiver les retours à la ligne.

James Heazlewood
la source