2011-05-20 2 views
3

Existe-t-il des versions (remplacements) des utilitaires shell standard qui affichent les résultats (partiels) mis à jour à la volée (peut-être sur stderr)?Existe-t-il des utilitaires de shell incrémentiels (interactifs)? C'est à dire. tri "en ligne", wc etc

Dire que je veux faire:

du ~/* -s | sort -rn | head 

Tout d'abord absolument rien ne se passe, avant du est fait. Je voudrais cependant voir des résultats partiels, c'est-à-dire que je veux sort pour montrer les données qu'il a déjà vues. De cette façon, je peux rapidement voir si quelque chose ne va pas avec la sortie et le corriger. Comme lors de l'exécution de grep.

Même chose avec ceci:

du ~/* -s | wc 

Je voudrais à jour à la volée.

Voici une vilaine contournement montrant un peu ce que je veux. (Mais de préférence, il ne doit pas consommer inutilement l'écran, comme avec du ci-dessous.)

du ~/* -s > /tmp/duout | watch -n .1 sort -rn /tmp/duout 

du ~/* -s > /tmp/duout | watch -n .1 wc /tmp/duout 

Cependant, je préfère de beaucoup si je pouvais n'aime:

du ~/* -s | isort -rn 

Répondre

4

De nombreux utilitaires shell affichent des résultats actifs. Un bon exemple serait le programme top. Le problème est, ces types d'outils ne se prêtent pas à la méthodologie linux habituelle d'entrée et de sortie. Sort est destiné à prendre un flux d'entrée, à le trier et à le sortir. Vous pouvez alors prendre cette sortie et faire autre chose avec. S'il sort des versions incrémentielles, il serait inutile pour un traitement ultérieur.

Si vous avez des besoins spécifiques pour voir des données partielles, vous devrez les hacher ensemble. Il est diamétralement opposé au flux de travail normal et à un gaspillage massif de ressources informatiques. De tels excès sont laissés à la discrétion du lecteur :)

Si vous avez un autre utilitaire spécifique et que vous vous demandez s'il existe un autre système d'affichage, n'hésitez pas à demander. Quant à ceux que vous mentionnez, en particulier sort, ils n'existent pas. Un affichage en direct de la sortie en sort ralentirait les résultats de plusieurs ordres de grandeur et personne ne veut regarder la sortie au prix d'attendre dix ou cent fois ou mille fois plus longtemps pour le résultat final.

+0

À quelle fréquence «sort» est-il l'étape la plus lente d'un pipeline? J'espérais quelque chose en utilisant un algorithme de tri en ligne, montrant éventuellement des résultats partiels sur stderr donc stdout est toujours utile dans le pipeline. En fait, il faudrait juste garder une trace de (par exemple) 10 plus grand/plus petit. Hmm ... Un tri en ligne pourrait-il être plus rapide dans certains cas? Par exemple. Si l'entrée arrive lentement, il n'y aura pas besoin d'une longue pause après la réception du dernier octet. – johv

+0

Votre première question n'est pas pertinente. La bonne question serait: «Combien de fois le sort prend-il du temps? Toutes les petites choses additionnent tu sais. Votre dernière question est très intéressante. Il est possible que ce soit plus rapide de faire un tri incrémental dans certains cas. Pas plus efficace, mais moins de temps sur l'horloge murale. Cependant votre cas semble très spécifique. Peut-être que vous devriez écrire quelque chose! – Caleb

0

Le problème n'est pas les utils, mais le shell lui-même. Vous avez besoin d'un shell différent qui démarre chaque processus dans une chaîne de pipelines en même temps. Les utilitaires toutes les entrées de flux très bien. Lancez un grep récursif pour le prouver à vous-même.

1

Vous pouvez insérer tee /dev/tty dans une séquence de tuyaux pour imprimer les résultats intermédiaires. tee duplique stdin, en envoyant la sortie à la fois à stdout et à tous les fichiers spécifiés sur la ligne de commande.Vous pouvez utiliser cette astuce pour voir la sortie du tout en passant simultanément à trier:

du ~/* -s | tee /dev/tty | sort -rn | head 

La sortie intermédiaire entre en collision avec la sortie de tri. Vous pouvez contourner ce problème avec diverses astuces de shell. par exemple, en envoyant la sortie de sorte à un téléavertisseur:

du ~/* -s | tee /dev/tty | sort -rn | less 
+0

ou l'envoi d'une sortie de tri vers un fichier pour révision ultérieure. c'est-à-dire du du// -s | tee/dev/tty | sort -rn> duInfo.txt'. Merci d'avoir partagé ;-) – shellter

0

Dans un cas normal de tri des données, vous devez lire toutes les données avant de pouvoir commencer à imprimer la valeur de la ligne 1 de données, droit ? Et comme vous le mentionnez, même chose avec du -s (ce qui signifie résumé, c'est trier et collationner des données aussi). Sortez le -s et vous obtenez une sortie non animée tout de suite.

Alors vous allez toujours devoir attendre ce genre de choses. La seule chose que vous pouvez faire avec votre premier exemple est d'ajouter un tee dans le flux de données

du ~/* -s | tee /dev/tty | sort -rn | head 

ou même

du ~/* -s | tee /dev/tty8 | sort -rn | tee /dev/tty12 | head 

où tty8 et tty12 sont des fenêtres terminales séparées, et que vous avez trouvé le bon ttyN à remplacer en utilisant tty dans la fenêtre shell.

J'espère que cela aide.

P.S. comme vous semblez être un nouvel utilisateur, si vous obtenez une réponse qui vous aide à ne pas oublier de la marquer comme acceptée, et/ou lui donner un + (ou -) comme réponse utile.

Questions connexes