Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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 big_smile)

# 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 lol

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]

Watael a écrit :

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]

serged a écrit :

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 neutral )

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 sad , 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 hmm ?!)
Ou peut'être vais-je trop loin alors qu'il y a plus simple, je ne sais vraiment pas sad

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    wink

  • Cliquer sur  le lien « Modifier » en bas à droite du message

  • Sélectionner le texte

  • Cliquer sur le <> de l'éditeur de message

moko138 a écrit :

1) Les balises-code sont les < > (crochets bleus) de la barre de mise en forme.

1578811399.jpg
        _ _ _

/!\  Si vous avez plusieurs retours à donner, séparez-les bien (toujours pour la lisibilité) :

comme
cela.

_ _ _

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 tongue

# 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 :
Screenshot_20210523_112721.png

Et si tu te passes de la commande column pour gérer l'affichage directement dans la variable Texte, ça peut donner ça :
Screenshot_20210523_113100.png

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]

Hizoka a écrit :

Ç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 tongue

# 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.png

Et 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.png

On 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 wink


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 smile


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]

NRA a écrit :

« ce ne sont pas les armes qui tuent les gens.
c'est le gens qui tuent les gens. »

lol


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 big_smile

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 (). smile

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]

Hizoka a écrit :

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 wink

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 :

Règles du forum= § Politesse a écrit :

(...)
3. Utilisez la citation avec modération : il ne sert à rien de citer l'intégralité du post précédent.
(...)

règles du forum


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 smile

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 smile

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 smile ( et également à ce petit bonus Watael )

Hors ligne