#1 Le 22/05/2021, à 07:28
- Pierre WADRA
Données commande"top" tableau [Résolue]
Bonjour,
je dois mettre sous forme de tableau les informations principales de la commande "top" à l'aide d'un script BASH. J'ai réussie à afficher les informations dont j'avais besoin, cependant je n'arrive pas à les mettre dans un tableau.
Si vous avez un peu de temps pour moi, une aide serait le bien venu
Voici le script en question :
#!/bin/bash
top | head -n 5 | tail -n 4
Dernière modification par Pierre WADRA (Le 27/05/2021, à 11:04)
Hors ligne
#2 Le 22/05/2021, à 10:01
- ar barzh paour
Re : Données commande"top" tableau [Résolue]
une solution :
essai avec mapfile
help mapfile
.... EDIT
oublie , trop compliqué ....
/EDIT
Dernière modification par ar barzh paour (Le 22/05/2021, à 11:23)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#3 Le 22/05/2021, à 10:19
- Hizoka
Re : Données commande"top" tableau [Résolue]
Salut,
plusieurs solutions :
- tu traites les lignes 1 à 1 pour ne conserver que ce que tu veux et tu envoies ça dans un tableau.
- tu balances les lignes dans un tableau et tu vires les éléments que tu ne veux pas.
Ex : Je fais un beau tableau en traitant les lignes une à une en bash :
# Pour un joli tableau associatif
declare -A SuperTab
# Traitement des lignes une à une
while read Ligne
do
# Si la ligne commence par Tâches
if [[ "$Ligne" == "Tâches"* ]]
then
Tache="${Ligne#* }" Tache="${Tache%% *}"
SuperTab["Tache"]="$Tache"
EnCours=${Ligne#*, } EnCours="${EnCours%%* }"
SuperTab["EnCours"]="$EnCours"
# ...
fi
done < <(top -b | head -n 5 | tail -n 4)
Ex : Je balance tout direct dans un tableau et je n'utilise que les numéros qui m’intéresse :
Tableau=($(top -b | head -n 5 | tail -n 4))
EDIT :
Je viens de perdre 20minutes à essayer de comprendre pourquoi mes résultats ne répondaient pas à mes attentes...
Il faut utiliser top -b !!
Version utilisant un tableau temporaire, il faudra adapter pour les autres lignes (du moins en version française )
# Pour un joli tableau associatif
declare -A SuperTab
# Traitement des lignes une à une
while read Ligne
do
# Si la ligne commence par Tâches
if [[ "$Ligne" == "Tâches"* ]]
then
Temp="${Ligne//[^0-9,]}"
Temp=(${Temp//,/ })
# Pour un joli tableau associatif
SuperTab["Tache"]=${Temp[0]}
SuperTab["EnCours"]=${Temp[1]}
SuperTab["EnVeille"]=${Temp[2]}
SuperTab["Arrete"]=${Temp[3]}
SuperTab["Zombie"]=${Temp[4]}
fi
done < <(top -b | head -n 5 | tail -n 4)
PS : Il y a un piège avec la ligne du swap
Dernière modification par Hizoka (Le 22/05/2021, à 10:41)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 22/05/2021, à 10:40
- Watael
Re : Données commande"top" tableau [Résolue]
je n'arrive pas à les mettre dans un tableau
un tableau ? un tableau graphique ? ou un tableau logique ?
pour afficher les données dans un certain format, ou
pour traiter les données ultérieurement ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 22/05/2021, à 23:46
- Pierre WADRA
Re : Données commande"top" tableau [Résolue]
je n'arrive pas à les mettre dans un tableau
un tableau ? un tableau graphique ? ou un tableau logique ?
pour afficher les données dans un certain format, ou
pour traiter les données ultérieurement ?
C'est un tableau pour afficher les données de "top" dans un tableau de données.
Ainsi, au lancement du script cela doit m'afficher:
Tâches 176 total(e.g) 1 en cours 175 en veille 0 arrêté
%Cpu(s) ... ... ... ...
MiB Mem ... ... ... ...
MiB Ech ... ... ... ...
Dernière modification par Pierre WADRA (Le 22/05/2021, à 23:58)
Hors ligne
#6 Le 23/05/2021, à 00:46
- Watael
Re : Données commande"top" tableau [Résolue]
ce n'est pas évident, car ces données constituent 3 tableaux avec des nombres de cellules différents (TASKS= 5 cols; CPU= 8 cols; MEM= 4 cols).
Tasks: 175 total, 1 running, 174 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.1 us, 0.0 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7909.1 total, 2906.9 free, 1216.4 used, 3785.8 buff/cache
MiB Swap: 19077.0 total, 19077.0 free, 0.0 used. 6277.2 avail Mem
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 23/05/2021, à 06:45
- serged
Re : Données commande"top" tableau [Résolue]
Plutôt qu'utiliser top qui met en forme interactivement les processus en cours, il ne serait pas plus judicuex d'utiliser la commande ps ?
pour reprendre ta commande :
ps aux | head -n 5 | tail -n 4
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#8 Le 23/05/2021, à 07:55
- Pierre WADRA
Re : Données commande"top" tableau [Résolue]
Plutôt qu'utiliser top qui met en forme interactivement les processus en cours, il ne serait pas plus judicuex d'utiliser la commande ps ?
pour reprendre ta commande :
ps aux | head -n 5 | tail -n 4
Le but de notre exercice étant d'afficher les informations comme ceci:
Tâches 176 total(e.g) 1 en cours 175 en veille 0 arrêté
%Cpu(s) ... ... ... ...
MiB Mem ... ... ... ...
MiB Ech ... ... ... ...
La commande ps ne permet pas de positionner "Tâches", "%Cpu(s)"... dans la première colonne ( du moins, il me semble )
J'ai d'ailleurs essayé une nouvelle fois avec ce script :
function fct1() {
eval "$1=$(top -b | head -n 2 | tail -n1 | cut -d' ' -f$2)"
}
printf "TOP\n"
fct1 tot 2
fct1 ec 6
fct1 ev 9
fct1 a 14
printf "Tâche\t%s total\t%s en cours\t%s en veille\t%s arrêté\n" $tot $ec $ev $a
ut=$(top -b | head -n 3 | tail -n1 | cut -d':' -f2 | cut -d'u' -f1)
printf "%%Cpu(s)\t%s ut" $ut
Néanmoins, je n'arrive pas à afficher les autres lignes ( ça n'affiche que la lignes des tâches et une petite partie de la ligne %CPU(s) )comme je le souhaite , peut'être n'ai-je pas compris certaine des explications précédentes, ou bien comme l'indiquer "Watael" : ce n'est juste pas évident xC (voir pas possible ?!)
Ou peut'être vais-je trop loin alors qu'il y a plus simple, je ne sais vraiment pas
Dernière modification par Pierre WADRA (Le 23/05/2021, à 08:06)
Hors ligne
#9 Le 23/05/2021, à 07:57
- xubu1957
Re : Données commande"top" tableau [Résolue]
Bonjour,
Comme demandé dans le premier message du tutoriel Retour utilisable de commande
Pour ajouter toi-même les balises code à ton précédent message #8 : Merci
Cliquer sur le lien « Modifier » en bas à droite du message
Sélectionner le texte
Cliquer sur le <> de l'éditeur de message
_ _ _
Tâches 176 total(e.g) 1 en cours 175 en veille 0 arrêté
%Cpu(s) ... ... ... ...
MiB Mem ... ... ... ...
MiB Ech ... ... ... ...
Voir règles du forum > balises BB code
Balise CODE :
C'est la balise à utiliser pour donner de longs messages d'erreurs, des contenus de fichiers de configuration, des commandes à taper, etc … Elle permet des messages plus "compacts", et est moins ambiguë que d'autres polices sur certains caractères.
Dernière modification par xubu1957 (Le 23/05/2021, à 08:16)
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Réso|u] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci. Membre de Linux-Azur
En ligne
#10 Le 23/05/2021, à 10:32
- Hizoka
Re : Données commande"top" tableau [Résolue]
Ça fait toujours plaisir de ne pas avoir de retours à sa proposition surtout quand elle permet d'avoir le résultat voulu...
M'enfin bon, bien que rancunier je suis pas méchant
# Variable qui sera à afficher
Texte=""
# Traitement des lignes une à une
while read Ligne
do
# Il te faudra faire une petite modification ici pour la ligne du swap qui à un petit problème
Temp="${Ligne//[^0-9,]}"
Temp=(${Temp//,/ })
# Traite les lignes en fonction de leurs 1er mots en minuscule
case "${Ligne,,}" in
# Si la ligne commence par task (oui on est en anglais car en français, la variable temps rencontrera des problèmes)
"task"*) Texte+="Tâches :|${Temp[0]} total|${Temp[1]} en cours|${Temp[2]} en veille|${Temp[3]} arrêté|${Temp[4]} zombie\n";;
# ...) A toi de jouer
esac
done < <(LANG=en top -b | head -n 5 | tail -n 4)
Il ne te reste plus qu'à jouer avec la commande column pour afficher la variable Texte.
Une fois les quelques trous remplis (essaie et montre nous si tu bloques), ça donne ça :
Et si tu te passes de la commande column pour gérer l'affichage directement dans la variable Texte, ça peut donner ça :
On peut donc arriver à ce que tu veux en moins de 15 lignes simples.
Dernière modification par Hizoka (Le 23/05/2021, à 11:22)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#11 Le 23/05/2021, à 14:26
- Pierre WADRA
Re : Données commande"top" tableau [Résolue]
Ça fait toujours plaisir de ne pas avoir de retours à sa proposition surtout quand elle permet d'avoir le résultat voulu...
M'enfin bon, bien que rancunier je suis pas méchant
# Variable qui sera à afficher Texte="" # Traitement des lignes une à une while read Ligne do # Il te faudra faire une petite modification ici pour la ligne du swap qui à un petit problème Temp="${Ligne//[^0-9,]}" Temp=(${Temp//,/ }) # Traite les lignes en fonction de leurs 1er mots en minuscule case "${Ligne,,}" in # Si la ligne commence par task (oui on est en anglais car en français, la variable temps rencontrera des problèmes) "task"*) Texte+="Tâches :|${Temp[0]} total|${Temp[1]} en cours|${Temp[2]} en veille|${Temp[3]} arrêté|${Temp[4]} zombie\n";; # ...) A toi de jouer esac done < <(LANG=en top -b | head -n 5 | tail -n 4)
Il ne te reste plus qu'à jouer avec la commande column pour afficher la variable Texte.
Une fois les quelques trous remplis (essaie et montre nous si tu bloques), ça donne ça :
https://hizo.fr/img/Screenshot_20210523_112721.pngEt si tu te passes de la commande column pour gérer l'affichage directement dans la variable Texte, ça peut donner ça :
https://hizo.fr/img/Screenshot_20210523_113100.pngOn peut donc arriver à ce que tu veux en moins de 15 lignes simples.
Alors premièrement, désolé ! :C et merci.
J'ai "tenté" de compléter votre script, néanmoins j'ai bloqué.
#!/bin/bash
# Variable qui sera à afficher
Texte=""
# Traitement des lignes une à une
while read Ligne
do
# Il te faudra faire une petite modification ici pour la ligne du swap qui à un petit problème
Temp="${Ligne//[^0-9,]}"
Temp=(${Temp//,/ })
# Traite les lignes en fonction de leurs 1er mots en minuscule
case "${Ligne,,}" in
# Si la ligne commence par task (oui on est en anglais car en français, la variable temps rencontrera des problèmes)
"task"*) Texte+="Tâches :|${Temp[0]} total|${Temp[1]} en cours|${Temp[2]} en veille|${Temp[3]} arrêté|${Temp[4]} zombie\n";;
"%cpu(s)"*) Texte+="%CPU(s) :|${Temp[0]} ut|${Temp[1]} sy|${Temp[2]} ni|${Temp[3]} id|${Temp[4]} wa|${Temp[5]} hi|${Temp[6]} si|${Temp[7]} st|${Temp[8]}\n";;
"MiB Mem"*) Texte+="MiB Mem :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} tamp/cash|${Temp[4]}\n";;
"MiB Swap"*) Texte+="MiB Éch :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} dispo Mem|${Temp[4]}\n";;
esac
done < <(LANG=en top -b | head -n 5 | tail -n 4)
echo -e $Texte
Première question : pourquoi je n'arrive pas à afficher MiB Mem ? c'est comme-ci ça ne le trouver pas, j'ai essayé avec "Mem" mais nada..
Deuxième question : Je n'ai pas compris ce qu'est le problème du swap, enfin en quoi cette ligne diffère des autres..
sinon j'obtiens (avec le script ci-dessus):
Tâches :|184 total|1 en cours|183 en veille|0 arrêté|0 zombie
%CPU(s) :|188 ut|125 sy|00 ni|688 id|00 wa|00 hi|00 si|00 st|
Ce format là est vient du fait que j'ai utilisé echo -e $Texte j'imagine.. (je ne me suis pas encore trop attardé sur la commande column)
Merci de votre réponse.. ( et encore désolé, je ne suis pas très doué en script bash )
EDIT: j'ai réussie à trouvé le problème du swap et jai tout affiché mais je ne comprend pas comment utilisé la commande column
Dernière modification par Pierre WADRA (Le 23/05/2021, à 15:24)
Hors ligne
#12 Le 23/05/2021, à 15:32
- Pierre WADRA
Re : Données commande"top" tableau [Résolue]
#!/bin/bash
# Variable qui sera à afficher
Texte=""
# Traitement des lignes une à une
while read Ligne
do
# Il te faudra faire une petite modification ici pour la ligne du swap qui à un petit problème
Temp=${Ligne//[^0-9,]}
Temp=(${Temp//,/ })
# Traite les lignes en fonction de leurs 1er mots en minuscule
case "${Ligne,,}" in
# Si la ligne commence par task (oui on est en anglais car en français, la variable temps rencontrera des problèmes)
"task"*) Texte+="Tâches :|${Temp[0]} total|${Temp[1]} en cours|${Temp[2]} en veille|${Temp[3]} arrêté|${Temp[4]} zombie\n";;&
"%cpu(s)"*) Texte+="%CPU(s) :|${Temp[0]} ut|${Temp[1]} sy|${Temp[2]} ni|${Temp[3]} id|${Temp[4]} wa|${Temp[5]} hi|${Temp[6]} si|${Temp[7]} st|${Temp[8]}\n";&
"MiB Mem"*) Texte+="MiB Mem :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} tamp/cash|${Temp[4]}\n";&
"Swap"*) Texte+="MiB Éch :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} dispo Mem|${Temp[4]}\n";
esac
done < <(LANG=en top -b | head -n 5 | tail -n 4)
echo -e $Texte
Voilà ce que j'ai pour l'instant ducoup.
Pour la commande Column, je n'arrive pas à l'utilisé comme dit dans l'edit. Pourtant sans l'utiliser, mon script ne renvoie pas le même résultat que le votre sans l'utilisation de la commande column
Hors ligne
#13 Le 23/05/2021, à 17:30
- Hizoka
Re : Données commande"top" tableau [Résolue]
Première question : pourquoi je n'arrive pas à afficher MiB Mem ? c'est comme-ci ça ne le trouver pas, j'ai essayé avec "Mem" mais nada..
Normal, car tu utilises des majuscules qu'il n'y en a plus dans mon test :
Ligne="Bonjour"
echo "$Ligne - ${Ligne,,}"
# Bonjour - bonjour
Comme l'indiquait mon commentaire :
# Traite les lignes en fonction de leurs 1er mots en minuscule
C'est quoi ces & en fin de ligne ?!
"task"*) Texte+="Tâches :|${Temp[0]} total|${Temp[1]} en cours|${Temp[2]} en veille|${Temp[3]} arrêté|${Temp[4]} zombie\n";;&
"%cpu(s)"*) Texte+="%CPU(s) :|${Temp[0]} ut|${Temp[1]} sy|${Temp[2]} ni|${Temp[3]} id|${Temp[4]} wa|${Temp[5]} hi|${Temp[6]} si|${Temp[7]} st|${Temp[8]}\n";&
"MiB Mem"*) Texte+="MiB Mem :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} tamp/cash|${Temp[4]}\n";&
Ça n'a rien à faire là...
et quand on utilise case, à la fin d'un bloc, c'est ;;
EDIT: j'ai réussie à trouvé le problème du swap
Je ne pense pas, regarde TRÈS attentivement, 1 caractère est erroné dans les retours de top.
Ton swap ne fonctionne pas car aucune ligne ne commence par swap, donc la ligne ne sera jamais traitée.
C'est pour ça que je t'indiquais :
# Il te faudra faire une petite modification ici pour la ligne du swap qui à un petit problème
Pour la commande Column, je n'arrive pas à l'utilisé comme dit dans l'edit.
man column
Pour t'aider, dans le cas présent, tu as besoin d'utiliser 2 options.
Pourtant sans l'utiliser, mon script ne renvoie pas le même résultat que le votre sans l'utilisation de la commande column
On revient sur le case qui est défectueux.
https://abs.traduc.org/abs-fr/ch11s04.html
Courage ! Tu y es presque !
PS : On peut se tutoyer
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#14 Le 23/05/2021, à 17:34
- Watael
Re : Données commande"top" tableau [Résolue]
C'est quoi ces & en fin de ligne ?!
Using ;& in place of ;; causes execution to continue with the list associated with the next set of patterns.
Using ;;& in place of ;; causes the shell to test the next pattern list in the statement, if any, and execute any associated list on a successful match, continuing the case statement execution as if the pattern list had not matched.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#15 Le 23/05/2021, à 17:58
- Hizoka
Re : Données commande"top" tableau [Résolue]
Je ne connaissais même pas ces possibilités...
Bon elles ne sont pas adaptées dans le cas présent mais merci
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#16 Le 23/05/2021, à 18:05
- kamaris
Re : Données commande"top" tableau [Résolue]
À mon avis elles sont à éviter en général : le genre de truc casse-gueule et pénible à suivre pour celui qui passe après…
Hors ligne
#17 Le 23/05/2021, à 18:16
- Watael
Re : Données commande"top" tableau [Résolue]
« ce ne sont pas les armes qui tuent les gens.
c'est le gens qui tuent les gens. »
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#18 Le 23/05/2021, à 18:50
- kamaris
Re : Données commande"top" tableau [Résolue]
Oui voilà, la technologie est neutre, d'ailleurs eval est une commande comme une autre
Hors ligne
#19 Le 23/05/2021, à 18:56
- Watael
Re : Données commande"top" tableau [Résolue]
grmrlgrmrlgroumf.
eval, c'est mal.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#20 Le 23/05/2021, à 23:32
- Hizoka
Re : Données commande"top" tableau [Résolue]
je suis d'ailleurs étonné que tu n’aies pas bondi sur :
function fct1() {
eval "$1=$(top -b | head -n 2 | tail -n1 | cut -d' ' -f$2)"
}
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#21 Le 24/05/2021, à 00:12
- Watael
Re : Données commande"top" tableau [Résolue]
c'est vrai, j'aurais dû réagir en voyant function ET ().
EDIT: cadeau Bonus :
$ while IFS='[:,]' read -ra ligne; do printf '%-20s' "${ligne[0]}"; for i in "${ligne[@]:1}"; do printf '%-15s' "${i##+([[:space:]])}"; done; echo; done < <(LC_ALL=C top -b -n 1 | sed -n '2,5{s/used\./used,/;p;}')
Tasks 178 total 1 running 177 sleeping 0 stopped 0 zombie
%Cpu(s) 22.7 us 19.7 sy 0.0 ni 57.6 id 0.0 wa 0.0 hi 0.0 si 0.0 st
MiB Mem 7909.1 total 3836.0 free 2122.3 used 1950.8 buff/cache
MiB Swap 19077.0 total 18968.8 free 108.2 used 5213.9 avail Mem
Dernière modification par Watael (Le 24/05/2021, à 00:46)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#22 Le 24/05/2021, à 00:33
- Pierre WADRA
Re : Données commande"top" tableau [Résolue]
Première question : pourquoi je n'arrive pas à afficher MiB Mem ? c'est comme-ci ça ne le trouver pas, j'ai essayé avec "Mem" mais nada..
Normal, car tu utilises des majuscules qu'il n'y en a plus dans mon test :
Ligne="Bonjour" echo "$Ligne - ${Ligne,,}" # Bonjour - bonjour
Comme l'indiquait mon commentaire :
# Traite les lignes en fonction de leurs 1er mots en minuscule
C'est quoi ces & en fin de ligne ?!
"task"*) Texte+="Tâches :|${Temp[0]} total|${Temp[1]} en cours|${Temp[2]} en veille|${Temp[3]} arrêté|${Temp[4]} zombie\n";;& "%cpu(s)"*) Texte+="%CPU(s) :|${Temp[0]} ut|${Temp[1]} sy|${Temp[2]} ni|${Temp[3]} id|${Temp[4]} wa|${Temp[5]} hi|${Temp[6]} si|${Temp[7]} st|${Temp[8]}\n";& "MiB Mem"*) Texte+="MiB Mem :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} tamp/cash|${Temp[4]}\n";&
Ça n'a rien à faire là...
et quand on utilise case, à la fin d'un bloc, c'est ;;EDIT: j'ai réussie à trouvé le problème du swap
Je ne pense pas, regarde TRÈS attentivement, 1 caractère est erroné dans les retours de top.
Ton swap ne fonctionne pas car aucune ligne ne commence par swap, donc la ligne ne sera jamais traitée.C'est pour ça que je t'indiquais :
# Il te faudra faire une petite modification ici pour la ligne du swap qui à un petit problème
Pour la commande Column, je n'arrive pas à l'utilisé comme dit dans l'edit.
man column
Pour t'aider, dans le cas présent, tu as besoin d'utiliser 2 options.
Pourtant sans l'utiliser, mon script ne renvoie pas le même résultat que le votre sans l'utilisation de la commande column
On revient sur le case qui est défectueux.
https://abs.traduc.org/abs-fr/ch11s04.htmlCourage ! Tu y es presque !
PS : On peut se tutoyer
Alors j'ai réussie (normalement) :
#!/bin/bash
# Variable qui sera à afficher
Texte=""
# Traitement des lignes une à une
while read Ligne
do
# Il te faudra faire une petite modification ici pour la ligne du swap qui à un petit problème
Temp="${Ligne//[^0-9,]}"
Temp=(${Temp//,/ })
# Traite les lignes en fonction de leurs 1er mots en minuscule
case "${Ligne,,}" in
# Si la ligne commence par task (oui on est en anglais car en français, la variable temps rencontrera des problèmes)
"task"*) Texte+="Tâches :|${Temp[0]} total|${Temp[1]} en cours|${Temp[2]} en veille|${Temp[3]} arrêté|${Temp[4]} zombie\n";;
"%cpu(s)"*) Texte+="%CPU(s) :|${Temp[0]} ut|${Temp[1]} sy|${Temp[2]} ni|${Temp[3]} id|${Temp[4]} wa|${Temp[5]} hi|${Temp[6]} si|${Temp[7]} st|${Temp[8]}\n";;
"mib mem"*) Texte+="MiB Mem :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} tamp/cash|${Temp[4]}\n";;
"mib swap"*) Texte+="MiB Éch :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} dispo Mem|${Temp[4]}\n";;
esac
done < <(LANG=en top -b | head -n 5 | tail -n 4 | sed 's/used./used,/g')
echo -e $Texte | column -t -s "|"
Merci de m'avoir aider jusqu'ici xp
j'obtiens bien :
Tâches : 188 total 1 en cours 187 en veille 0 arrêté 0 zombie
%CPU(s) : 188 ut 62 sy 00 ni 750 id 00 wa 00 hi 00 si 00 st
MiB Mem : 34253 total 7401 libr 16854 util 9997 tamp/cash
MiB Éch : 4485 total 4485 libr 00 util 15238 dispo Mem
Hors ligne
#23 Le 24/05/2021, à 06:03
- xubu1957
Re : Données commande"top" tableau [Résolue]
Bonjour,
Détail pratique pour alléger les messages :
(...)
3. Utilisez la citation avec modération : il ne sert à rien de citer l'intégralité du post précédent.
(...)
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Réso|u] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci. Membre de Linux-Azur
En ligne
#24 Le 24/05/2021, à 10:12
- Hizoka
Re : Données commande"top" tableau [Résolue]
Pas mal
Quelques retours préciser avec # ICI
#!/bin/bash
Texte=""
while read Ligne
do
# ICI : On change le fameux used.
Temp="${Ligne//used\./used,}"
# ICI : il faut pas effacer les .
Temp="${Temp//[^0-9,.]}"
Temp=(${Temp//,/ })
case "${Ligne,,}" in
"task"*) Texte+="Tâches :|${Temp[0]} total|${Temp[1]} en cours|${Temp[2]} en veille|${Temp[3]} arrêté|${Temp[4]} zombie\n";;
"%cpu(s)"*) Texte+="%CPU(s) :|${Temp[0]} ut|${Temp[1]} sy|${Temp[2]} ni|${Temp[3]} id|${Temp[4]} wa|${Temp[5]} hi|${Temp[6]} si|${Temp[7]} st|${Temp[8]}\n";;
"mib mem"*) Texte+="MiB Mem :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} tamp/cash|${Temp[4]}\n";;
"mib swap"*) Texte+="MiB Éch :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} dispo Mem|${Temp[4]}\n";;
esac
# ICI : On vire le sed qui est un appel à une commande externe sur un pipe et on ajoute -n 1 pour être sur qu'il ne fait qu'une boucle
# ICI : Tu peux remplacer head -n 5 | tail -n 4 par sed -n '2,5p' pour que ça fasse une commande et un pipe en moins, ça prend autant de temps mais c'est plus lisible
done < <(LANG=en top -b -n 1 | head -n 5 | tail -n 4)
# ICI : On protège les variables avec des guillemets
echo -e "$Texte" | column -t -s "|"
Ma petite version sed en gardant le même case :
Texte=""
x=0
while read -ra Temp
do
case $x in
0) Texte+="Tâches :|${Temp[0]} total|${Temp[1]} en cours|${Temp[2]} en veille|${Temp[3]} arrêté|${Temp[4]} zombie\n";;
1) Texte+="%CPU(s) :|${Temp[0]} ut|${Temp[1]} sy|${Temp[2]} ni|${Temp[3]} id|${Temp[4]} wa|${Temp[5]} hi|${Temp[6]} si|${Temp[7]} st|${Temp[8]}\n";;
2) Texte+="MiB Mem :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} tamp/cash|${Temp[4]}\n";;
3) Texte+="MiB Éch :|${Temp[0]} total|${Temp[1]} libr|${Temp[2]} util|${Temp[3]} dispo Mem|${Temp[4]}\n";;
esac
((x++))
done < <(LANG=en top -b -n 1 | sed -n "2,5 {s/used./used,/; s/[^0-9,.]*//g; s/,/ /gp}")
echo -e "$Texte" | column -t -s "|"
La version de Watael en us est vraiment pas mal aussi
while IFS='[:,]' read -ra ligne
do
printf '%-20s' "${ligne[0]}"
for i in "${ligne[@]:1}"
do
printf '%-15s' "${i##+([[:space:]])}"
done
echo
done < <(LC_ALL=C top -b -n 1 | sed -n '2,5{s/used\./used,/;p;}')
Dernière modification par Hizoka (Le 24/05/2021, à 10:26)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#25 Le 25/05/2021, à 06:43
- Pierre WADRA
Re : Données commande"top" tableau [Résolue]
Merci pour ces retours Hizoka ( et également à ce petit bonus Watael )
Hors ligne