URL: https://linuxfr.org/users/nico57/journaux/sort-tri-de-route Title: sort - tri de route Authors: Nicolas Melay Date: 2006年04月12日T17:03:45+02:00 Tags: Score: 0 Chères lectrices, chers lecteurs, En ma qualité d'administrateur réseau (dit comme ça, ça en jette, hein?), je suis régulièrement amené à utiliser la commande « route » (bon, là, nettement moins). Mon problème, c'est que quand la dite commande me renvoie une cinquantaine de routes dans le désordre, je peine un peu à m'y retrouver. J'ai déjà appris que l'on pouvait trier efficacement une liste d'adresses IP, à l'aide d'un « sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4». C'est un premier pas. Seulement la commande « route » commence par produire 2 lignes d'entête avant d'afficher le résultat. Ces 2 lignes se retrouvent donc dans la moulinette de « sort » et l'affichage s'en retrouve perturbé (bon, OK, rien de désastreux, mais je suis un poil perfectionniste.) Avec un brin d'imagination, j'ai tenté la mise en série de filtres dans un shell intermédiaire : route | (head -n 2; sort -n -t. -k1,1 -k2,2 -k3,3) Hélas, « head » bouffe bien plus que la tête, et « sort » n'a plus rien à se mettre sous la dent. Je ne récupère **que** les 2 lignes d'entête. Même résultat en utilisant un « sed -e "n;q" » à la place du « head -n 2 ». Il s'agit visiblement d'un problème de buffer d'entrée remplit trop avidement, puisque par exemple ls -l /usr/bin | (head -n 1; cat)me renvoie l'entête « total » suivie de la fin du « ls -l ». À noter que « ls -l /usr/bin | (dd of=/dev/null bs=8192 count=1; cat) » me renvoie **exactement** le même résultat (à l'exception de l'entête bien sûr); head utilise donc un buffer de 8 Ko. Tout cela m'amène à une interrogation plus générale: **comment appliquer efficacement plusieurs filtres sur la sortie d'une même commande**, l'un sur les n premières lignes, et un autre sur la suite ? L'idée de la mise en série dans un shell tient pourtant la route, puisque par exemple route | (read a; read b; echo -e "$a\n$b"; sort -n -t. -k1,1 -k2,2 -k3,3) fonctionne. Faut-il considérer que head, sed, et probablement d'autres sont buggés? Ces commandes sont-elles sensées absorber plus de données qu'elles ne vont finalement en traiter? Y aurait-il un ajustement possible quelque part pour éviter cela? Ou peut-être que j'en demande trop à un simple shell et que ferais mieux de faire du <votre langage de script préféré> ? Vos commentaires et avis sur la question sont les bienvenus.

AltStyle によって変換されたページ (->オリジナル) /