#1 Le 11/01/2008, à 19:03
- B@rtounet
[Résolu] Donner des titres aux colonnes... dans un tableau
Bonjour, je cherche à faire un script qui m'affiche des valeurs dans un tableau sur 2 ou 3 colonnes, ma questions est simple, comment mettre un titre ne haut d'une colonne...?
a l'heure actuelle mon script affiche bien les deux colonnes, mais j'ai beau chercher je ne comprend ps comment mettre un titre sur la colonne...
Dernière modification par B@rtounet (Le 25/01/2008, à 23:12)
Hors ligne
#2 Le 11/01/2008, à 21:38
- best_friend_fr
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Euhh,
Script en quel langage?
Affiche le tableau ou, comment?
Peux tu donner ton source ?
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#3 Le 11/01/2008, à 21:45
- B@rtounet
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Merci pour ta réponse script en shell basique
affiche un tableau sur la sortie standard...
voici mon script de départ...
#!/bin/bash
#Antony MARTINEAU 2008
#Show info on Running VM
vmrun="/tmp/vmrun"
while [ 1 ]
do
clear
#VM qui tourne sur le noeud
xm list | awk '$1 != "Domain-0" {print $1}'|sed '/Name/d' > $vmrun
#Nombre de VM
vmnum=$(cat /tmp/vmrun | wc -l)
for i in `seq 1 $vmnum`
do
vmname=$(cat $vmrun | awk 'NR == '$i' {print;}')
pidvm=$(ps aux | grep qemu-dm |grep $vmname | awk '{print $2}')
vncport=$(netstat -anp | grep LIST | grep $pidvm | awk '{print $4}' | cut -d":" -f2)
tableau="$vmname"
tableau[1]="$vncport"
echo ${tableau[*]}
done
sleep 1
rm -f $vmrun
done
rm -f $vmrun
ce script sert à visualiser les machine virtuel Xen qui sont démarré sur un noeud et d'afficher en face le port sur lequel la prise de controle VNC est attaché...
Je sais c'est un peu abstrait quand on connais pas Xen, mais à la rigueur ce n'est pas grave, je veux juste qu'on me donne des piste pour afficher des titres aux collones...
voila ce que donne le script une fois lancé...
debian4 5902
ubuntuserver 5900
win2k3 5901
deja l'idéal serait de donner un titre a la colonne 1 et 2 et d'aligner les valeurs...
en fait j'aimerai que ca donne
Name VNC-Port
debian4 5902
ubuntuserver 5900
win2k3 5901
Hors ligne
#4 Le 13/01/2008, à 01:31
- B@rtounet
Hors ligne
#5 Le 13/01/2008, à 01:38
- HymnToLife
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Je ne suis pas un pro du Bash, mais ça ne marche pas en faisant un bête
echo "Name\tVNC-Port"
avant ta boucle for ?
- Rodrigue, as-tu du cœur ?
- Non, mais j'ai du pique !
Hors ligne
#6 Le 13/01/2008, à 01:40
- Link31
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Peut-être ça, tout simplement (je ne peux pas le tester) :
#!/bin/bash
#Antony MARTINEAU 2008
#Show info on Running VM
vmrun="/tmp/vmrun"
echo -e "Name\tVNC-Port"
while [ 1 ]
do
clear
#VM qui tourne sur le noeud
xm list | awk '$1 != "Domain-0" {print $1}'|sed '/Name/d' > $vmrun
#Nombre de VM
vmnum=$(cat /tmp/vmrun | wc -l)
for i in `seq 1 $vmnum`
do
vmname=$(cat $vmrun | awk 'NR == '$i' {print;}')
pidvm=$(ps aux | grep qemu-dm |grep $vmname | awk '{print $2}')
vncport=$(netstat -anp | grep LIST | grep $pidvm | awk '{print $4}' | cut -d":" -f2)
echo -e "$vmname\t$vncport"
done
sleep 1
rm -f $vmrun
done
rm -f $vmrun
Hors ligne
#7 Le 13/01/2008, à 10:48
- B@rtounet
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Merci pour vos réponses, je viens de tester et je ne connaissait pas cette facon d'utiliser echo c'est une très bonne idée...
selon ou on met la ligne ca ne fonctionne pas..., il faut en fait l'integrer dans la boucle...
Bon c'est bien ce que je recherche, mais il a juste un probleme de mise en page...
j'aimerais que les titres soient alignés avec les colonnes...
Voici le nouveau script.
#!/bin/bash
#Antony MARTINEAU 2008
#Show info on Running VM
vmrun="/tmp/vmrun"
while [ 1 ]
do
clear
echo -e "Name\tVNC-Port"
#VM qui tourne sur le noeud
xm list | awk '$1 != "Domain-0" {print $1}'|sed '/Name/d' > $vmrun
#Nombre de VM
vmnum=$(cat /tmp/vmrun | wc -l)
for i in `seq 1 $vmnum`
do
vmname=$(cat $vmrun | awk 'NR == '$i' {print;}')
pidvm=$(ps aux | grep qemu-dm |grep -w $vmname | awk '{print $2}')
vncport=$(netstat -anp | grep LIST | grep -w $pidvm | awk '{print $4}' | cut -d":" -f2)
echo -e "$vmname\t$vncport"
done
sleep 1
rm -f $vmrun
done
rm -f $vmrun
Et voici le résultat:
Name VNC-Port
ubuntuserver 5900
win2k3 5901
win2k3V2 5902
Hors ligne
#8 Le 13/01/2008, à 11:00
- B@rtounet
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Bon je viens de l'adapter cela semble marcher, j'ai enlever la boucle while pour l'instant et j'ai mis des espaces...
Encore merci pour votre aide
#!/bin/bash
#Antony MARTINEAU 2008
#Show info on Running VM
vmrun="/tmp/vmrun"
peernode=$(cat /etc/xen/peernode)
#VM qui tourne sur le noeud
xm list | awk '$1 != "Domain-0" {print $1}'| sed '/Name/d' > $vmrun
echo -e "Name\t \tVNC-Port\tRessource"
#Nombre de VM
vmnum=$(cat /tmp/vmrun | wc -l)
for i in `seq 1 $vmnum`
do
vmname=$(cat $vmrun | awk 'NR == '$i' {print;}')
pidvm=$(ps aux | grep qemu-dm |grep -w $vmname | awk '{print $2}')
vncport=$(netstat -anp | grep LIST | grep $pidvm | awk '{print $4}' | cut -d":" -f2)
vmres=$(cat /etc/xen/vm/$vmname | grep "#" | cut -d'"' -f2 | cut -d"#" -f2 | sed 's/_//' | sed 's/_/ /' |sed 's/_/ /' | sed 's/_/ /'| sed 's/_/ /')
echo -e "$vmname\t$vncport\t \t$vmres"
done
rm -f $vmrun
rm -f $vmrun#!/bin/bash
#Antony MARTINEAU 2008
#Show info on Running VM
vmrun="/tmp/vmrun"
peernode=$(cat /etc/xen/peernode)
#VM qui tourne sur le noeud
xm list | awk '$1 != "Domain-0" {print $1}'| sed '/Name/d' > $vmrun
echo -e "Name\t \tVNC-Port\tRessource"
#Nombre de VM
vmnum=$(cat /tmp/vmrun | wc -l)
for i in `seq 1 $vmnum`
do
vmname=$(cat $vmrun | awk 'NR == '$i' {print;}')
pidvm=$(ps aux | grep qemu-dm |grep -w $vmname | awk '{print $2}')
vncport=$(netstat -anp | grep LIST | grep $pidvm | awk '{print $4}' | cut -d":" -f2)
vmres=$(cat /etc/xen/vm/$vmname | grep "#" | cut -d'"' -f2 | cut -d"#" -f2 | sed 's/_//' | sed 's/_/ /' |sed 's/_/ /' | sed 's/_/ /'| sed 's/_/ /')
echo -e "$vmname\t$vncport\t \t$vmres"
done
rm -f $vmrun
rm -f $vmrun
Voici le resultat:
Name VNC-Port Ressource
win2K3_32_0 5900 r0
win2K3_32_1 5901 r1
win2K3_32_2 5902 r2
win2K3_32_3 5903 r3 r6
win2K3_32_4 5904 r4
win2K3_32_5 5905 r5
win2K3_32_test 5906 r7
win2K3_32_test2 5907 r8 r9
win2K3_32_test3 5908 r10 r11
Par contre sa semble deconner pour les noms court des vm
Name VNC-Port
ubuntuserver 5900
win2k3 5901
win2k3V2 5902
Dernière modification par B@rtounet (Le 13/01/2008, à 11:16)
Hors ligne
#9 Le 14/01/2008, à 11:20
- Aurel34
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Par contre sa semble deconner pour les noms court des vm
Name VNC-Port ubuntuserver 5900 win2k3 5901 win2k3V2 5902
tu peux peut-être tester la longueur de la chaine
if [ ${#vmname} -lt 8 ]
then
echo -e "$vmname\t\t$vncport\t \t$vmres"
else
echo -e "$vmname\t$vncport\t \t$vmres"
fi
?
#10 Le 14/01/2008, à 16:03
- freebird
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Avec un gawk tu éviterais les soucis des noms courts en utilisant un printf. Par exemple :
for i in `seq 1 $vmnum`
do
vmname=$(cat $vmrun | awk 'NR == '$i' {print;}')
pidvm=$(ps aux | grep qemu-dm |grep -w $vmname | awk '{print $2}')
vncport=$(netstat -anp | grep LIST | grep $pidvm | awk '{print $4}' | cut -d":" -f2)
vmres=$(cat /etc/xen/vm/$vmname | grep "#" | cut -d'"' -f2 | cut -d"#" -f2 | sed 's/_//' | sed 's/_/ /' |sed 's/_/ /' | sed 's/_/ /'| sed 's/_/ /')
echo "$vmname $vncport $vmres"
done | gawk 'BEGIN { print "Name VNC-Port Ressource" }
{ printf("%-16s %-7s %s",$1,$2,$3) }'
J'ai inclus l'affichage du titre de ta liste dans le gawk, à toi de voir comment tu veux faire ça
Hors ligne
#11 Le 24/01/2008, à 18:32
- B@rtounet
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
c'est interessant freebird mais peux tu m'en dire plus...je ne comprend pas la derniere ligne a quoi correspond ces variables...?
Hors ligne
#12 Le 24/01/2008, à 19:33
- freebird
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
La dernière ligne est la suite de la commande gawk
gawk 'BEGIN { print "Name VNC-Port Ressource" }
{ printf("%-16s %-7s %s",$1,$2,$3) }'
On peut l'écrire aussi sur une ligne :
gawk 'BEGIN { print "Name VNC-Port Ressource" }; { printf("%-16s %-7s %s",$1,$2,$3) }'
Je suppose que tu veux l'explication de l'utilisation de la commande printf, donc :
- "%-16s %-7s %s" : spécification du format de l'affichage
%-16s pour dire que la variable est une string affichée sur 16 positions et que ce sera aligné à gauche
%-7s la même chose mais sur 7 positions
%s la variable est une string et elle sera affichée sans formatage
- $1,$2,$3 : sont les variables passées à la fonction. $1 = première colonne, $2 = seconde colonne, etc...
Au final $1 aura le format %-16s, $2 le format %-7s, etc...
Donc en entrée tu as :
win2K3_32_0 5900 r0
Et tu auras comme affichage :
Name VNC-Port Ressource
win2K3_32_0 5900 r0
J'en profite d'ailleurs pour m'apercevoir qu'il y a une erreur sur le format vu qu'il n'y a pas de retour à la ligne et que la seconde colonne n'est pas assez grande donc la bonne syntaxe serait la suivante :
gawk 'BEGIN { print "Name VNC-Port Ressource" }
{ printf("%-16s %-8s %s\n",$1,$2,$3) }'
\n = retour à la ligne
Question subsidiaire, en regardant tes exemples j'ai vu que tu pouvais avoir plusieurs Ressources, c'est le cas ?
Hors ligne
#13 Le 25/01/2008, à 10:05
- B@rtounet
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
ouep, de plus ma commande deviens bcp plus compliquée... j'ai plusieurs ressources et avec ma méthode actuelle quand j'ai 3 ressources l'ensemble est décalé....
Je post mon script.. je sais qu'il est long et je comprendrais que tu veuille pas te lancer la dedans :-)
Mais juste me donner des pistes pour contruires un vrai tableau ou les titres sont bien allignés avec les collonnes
#!/bin/bash
#
#Xen Virtual Machine Information by Antony MARTINEAU.
#Fonction pour afficher les echo en couleur
#31=rouge, 32=vert, 33=jaune,34=bleu, 35=rose, 36=cyan, 37= blanc
color()
{
#echo [$1 `shift`m$*[m
printf '\033[%sm%s\033[m\n' "$@"
}
#ecihft`m$*o
xmlist="/tmp/xmlistfic"
xmsched="/tmp/schedlist"
xmdomshow="/tmp/domshow"
dompath="/etc/xen/vm"
peername=$(cat /etc/xen/peernode | grep name | cut -d" " -f2)
hostname=$(uname -n)
if test -f $xmdomshow
then
echo "$xmdomshow existe"
rm -f $xmdomshow
fi
if test -f $xmlist
then
echo "$xmlist existe"
rm -f $xmlist
fi
if test -f $xmsched
then
echo "$xmsched existe"
rm -f $xmsched
fi
xm list > $xmlist
xm sched-credit > $xmsched
echo `color 31 "On $hostname"`
echo -e `color 32 "Name\t \tStatus\tID\tVcpus\tTime\tWeight\tCap\tMem\tState\t \tResources\t \tr1 size\t \tr2 size\t \tr3 size\t \tr4 size\t \tVNC-Port"`
lines=$(cat /etc/xen/vm/*|grep "name"|cut -d'"' -f2| wc -l)
if [ -z $lines ]; then
lines=1
fi
for i in `seq 1 $lines`
do
vmname[$i]=$(cat $dompath/*|grep "name" |cut -d'"' -f2 |sed -n "$i{p;q;}")
vmres[$i]=$(cat $dompath/*|grep "#_r"|cut -d'"' -f2 | cut -d"#" -f2 | sed 's/_//' | sed 's/_/ /' |sed 's/_/ /' | sed 's/_/ /'| sed 's/_/ /' |sed -n "$i{p;q;}")
vname=${vmname[$i]}
res=${vmres[$i]}
pidvm=$(ps aux | grep -w qemu-dm |grep -w $vname | awk '{print $2}')
vmid=$(cat $xmlist | grep -w $vname | awk '{print $2}' | cut -d":" -f2)
vmmem=$(cat $dompath/$vname | grep memory | cut -d"=" -f2)
vmcpu=$(cat $dompath/$vname | grep vcpus | cut -d"=" -f2)
vmstate=$(cat $xmlist | grep -w $vname | awk '{print $5}' | cut -d":" -f2)
vmtime=$(cat $xmlist | grep -w $vname | awk '{print $6}' | cut -d":" -f2)
vmweight=$(cat $xmsched | grep -w $vname | awk '{print $3}' | cut -d":" -f2)
vmcap=$(cat $xmsched | grep -w $vname | awk '{print $4}' | cut -d":" -f2)
lvname=$(echo $res | sed 's/r/vm/')
lvsize=$(lvdisplay | grep -B8 lv$i | grep Size | awk '{print $3}')
vmexist=$(cat $xmlist | grep $vname | awk '{print $1}')
vmresor=$(cat /etc/xen/vm/* | grep "#_r" |cut -d'"' -f2 | cut -d"#" -f2 | sed -n "$i{p;q;}")
res4=$( echo $vmresor | cut -d"_" -f5)
res3=$( echo $vmresor | cut -d"_" -f4)
res2=$( echo $vmresor | cut -d"_" -f3)
res1=$( echo $vmresor | cut -d"_" -f2)
sizer1=$empty
if [ ! -z $res1 ]; then
lv1=$(echo $res1 | sed 's/r/lv/')
sizer1=$(lvdisplay | grep -A8 -w $lv1 | grep Size | awk '{print $3}')
fi
sizer2=$empty
if [ ! -z $res2 ]; then
lv2=$(echo $res2 | sed 's/r/lv/')
sizer2=$(lvdisplay | grep -A8 -w $lv2 | grep Size | awk '{print $3}')
fi
sizer3=$empty
if [ ! -z $res3 ]; then
lv3=$(echo $res3 | sed 's/r/lv/')
sizer3=$(lvdisplay | grep -A8 -w $lv3 | grep Size | awk '{print $3}')
fi
sizer4=$empty
if [ ! -z $res4 ]; then
lv4=$(echo $res4 | sed 's/r/lv/')
sizer4=$(lvdisplay | grep -A8 -w $lv4 | grep Size | awk '{print $3}')
fi
if [ -z $pidvm ]; then
vncport="No vnc"
else
vncport=$(netstat -anp | grep LIST | grep -w $pidvm | awk '{print $4}' | cut -d":" -f2 )
fi
if [ -z $vmexist ]; then
vmrun="off"
else
vmrun="on"
fi
peername=$(cat /etc/xen/peernode | grep name | cut -d" " -f2)
echo -e "$vname\t$vmrun\t$vmid\t$vmcpu\t$vmtime\t$vmweight\t$vmcap\t$vmmem\t$vmstate\t \t$res\t \t \t$sizer1\t \t$sizer2\t \t$sizer3\t \t$sizer4\t \t$vncport"
done
rm -f $xmlist
rm -f $xmsched
#ssh suse2 /usr/sbin/domshow
#exit 0
On suse1
Name Status ID Vcpus Time Weight Cap Mem State Resources r1 size r2 size r3 size r4 size VNC-Port
vm-rac off 2 512 r10 r11 r12 r13 8.00 8.00 8.00 8.00 No vnc
win2K3_32_0 on 31 2 1025.2 512 150 512 -b---- r0 8.00 5900
je comprend pas comment utiliser les variables $1 $2 je dois les remplacer par mes propres variables ? $vname etc... ??? de plus je comprend pas pkoi tu le met après le done... tu sort de la boucle
si je suis ta logique je devrais ecrire ?
gawk 'BEGIN { print "Name VNC-Port Ressource" }; { printf("%-16s %-8s %s\n",'$vname','$vncport','$res') }'
mais apperement il interprete pas mes variables
je pense que le fait qu'il y ai plusieurs ressources ne pose pase de probleme, car meme si il y a 4 ressources ce n'est qu'une seule variable qui affiche r1 r2 r3 r4
On suse1
Name VNC-Port Ressource
/usr/sbin/domtemp: line 116: { printf("%-16s %-8s %s\n",vm-rac,No: command not found
Name VNC-Port Ressource
/usr/sbin/domtemp: line 116: { printf("%-16s %-8s %s\n",win2K3_32_0,5900,r0) }: command not found
Dernière modification par B@rtounet (Le 25/01/2008, à 11:20)
Hors ligne
#14 Le 25/01/2008, à 14:30
- freebird
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
En effet c'est déjà plus compliqué
En réindentant correctement j'ai compris à peut prêt ce que tu fais.
Remplacer ta ligne d'echo :
echo -e "$vname\t$vmrun\t$vmid\t$vmcpu\t$vmtime\t$vmweight\t$vmcap\t$vmmem\t$vmstate\t \t$res\t \t \t$sizer1\t \t$sizer2\t \t$sizer3\t \t$sizer4\t \t$vncport"
Par cette ligne d'echo (sur une seule ligne pas 2 comme c'est affiché ici ) :
echo -e "$vname\t$vmrun\t$vmid\t$vmcpu\t$vmtime\t$vmweight\t$vmcap\t$vmmem\t$vmstate\t$res\t$sizer1\t$sizer2\t$sizer3\t$sizer4\t$vncport"
Le but étant de dire que chaque information sera séparée par une seule tabulation. Le gawk utilisera la tabulation comme séparateur de valeur afin de faciliter l'affichage.
Maintenant remplace la ligne :
done
par
done | gawk -F"\t" ' { printf("%-15s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-15s %-23s %-15s %-15s %-15s %-15s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) }'
Tu n'as pas à modifier $1, $2, $3, etc...
$1 correspond à la première valeur de la ligne (pour toi vname)
$2 à la seconde valeur de la ligne (pour toi vmrun)
$3 à la troisième valeur de la ligne (pour toi vmid)
etc...
J'ai compté 15 colonnes de valeurs, j'espère ne pas en avoir oublié
Vu que tu mets en couleur la ligne de titre, il ne faut pas conserver la partie BEGIN du gawk.
Suis-je plus clair ?:P
Dernière modification par freebird (Le 25/01/2008, à 14:31)
Hors ligne
#15 Le 25/01/2008, à 15:09
- B@rtounet
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Alors là je suis bluffé... je te remercie, bon j'ai encore du mal à comprendre pourquoi je n'aurais plus de probleme avec les noms longs et les noms courts...
Par contre ca fonctionne vraiment très bien je te remet mon code final et pour voir ton boulot le résultat...
Merci à toi, c'est vraiment sympa d'avoir pris le temps de lire mon code...
Script Final
#!/bin/bash
#DOMLIST
#Xen Virtual Machine Information by Antony MARTINEAU.
#Fonction pour afficher les echo en couleur
#31=rouge, 32=vert, 33=jaune,34=bleu, 35=rose, 36=cyan, 37= blanc
color()
{
printf '\033[%sm%s\033[m\n' "$@"
}
xmlist="/tmp/xmlistfic"
xmsched="/tmp/schedlist"
xmdomshow="/tmp/domshow"
dompath="/etc/xen/vm"
hostname=$(uname -n)
if test -f $xmdomshow
then
echo "$xmdomshow existe"
rm -f $xmdomshow
fi
if test -f $xmlist
then
echo "$xmlist existe"
rm -f $xmlist
fi
if test -f $xmsched
then
echo "$xmsched existe"
rm -f $xmsched
fi
xm list > $xmlist
xm sched-credit > $xmsched
echo `color 31 "On $hostname"`
echo -e `color 32 "Name\t \tStatus\tID\tVcpus\tTime\tWeight\tCap\tState\tMemory\t \tResources\t \tr1 size\t \tr2 size\t \tr3 size\t \tr4 size\t \tVNC-Port"`
lines=$(cat /etc/xen/vm/*|grep "name"|cut -d'"' -f2| wc -l)
if [ -z $lines ]; then
lines=1
fi
for i in `seq 1 $lines`
do
vmname[$i]=$(cat $dompath/*|grep "name" |cut -d'"' -f2 |sed -n "$i{p;q;}")
vmres[$i]=$(cat $dompath/*|grep "#_r"|cut -d'"' -f2 | cut -d"#" -f2 | sed 's/_//' | sed 's/_/ /' |sed 's/_/ /' | sed 's/_/ /'| sed 's/_/ /' |sed -n "$i{p;q;}")
vname=${vmname[$i]}
res=${vmres[$i]}
pidvm=$(ps aux | grep -w qemu-dm |grep -w $vname | awk '{print $2}')
vmid=$(cat $xmlist | grep -w $vname | awk '{print $2}' | cut -d":" -f2)
vmmem=$(cat $dompath/$vname | grep memory | cut -d"=" -f2)
memory=$(echo $vmmem MB)
vmcpu=$(cat $dompath/$vname | grep vcpus | cut -d"=" -f2)
vmstate=$(cat $xmlist | grep -w $vname | awk '{print $5}' | cut -d":" -f2)
vmtime=$(cat $xmlist | grep -w $vname | awk '{print $6}' | cut -d":" -f2)
vmweight=$(cat $xmsched | grep -w $vname | awk '{print $3}' | cut -d":" -f2)
vmcap=$(cat $xmsched | grep -w $vname | awk '{print $4}' | cut -d":" -f2)
lvname=$(echo $res | sed 's/r/vm/')
lvsize=$(lvdisplay | grep -B8 lv$i | grep Size | awk '{print $3}')
vmexist=$(cat $xmlist | grep $vname | awk '{print $1}')
vmresor=$(cat /etc/xen/vm/* | grep "#_r" |cut -d'"' -f2 | cut -d"#" -f2 | sed -n "$i{p;q;}")
res4=$( echo $vmresor | cut -d"_" -f5)
res3=$( echo $vmresor | cut -d"_" -f4)
res2=$( echo $vmresor | cut -d"_" -f3)
res1=$( echo $vmresor | cut -d"_" -f2)
sizer1=$empty
if [ ! -z $res1 ]; then
lv1=$(echo $res1 | sed 's/r/lv/')
sizer1=$(lvdisplay | grep -A8 -w $lv1 | grep Size | awk '{print $3,$4}')
else
res1=" "
fi
sizer2=$empty
if [ ! -z $res2 ]; then
lv2=$(echo $res2 | sed 's/r/lv/')
sizer2=$(lvdisplay | grep -A8 -w $lv2 | grep Size | awk '{print $3,$4}')
else
res2=" "
fi
sizer3=$empty
if [ ! -z $res3 ]; then
lv3=$(echo $res3 | sed 's/r/lv/')
sizer3=$(lvdisplay | grep -A8 -w $lv3 | grep Size | awk '{print $3,$4}')
else
res3=" "
fi
sizer4=$empty
if [ ! -z $res4 ]; then
lv4=$(echo $res4 | sed 's/r/lv/')
sizer4=$(lvdisplay | grep -A8 -w $lv4 | grep Size | awk '{print $3,$4}')
else
res4=" "
fi
if [ -z $pidvm ]; then
vncport="No vnc"
else
vncport=$(netstat -anp | grep LIST | grep -w $pidvm | awk '{print $4}' | cut -d":" -f2 )
fi
if [ -z $vmexist ]; then
vmrun="off"
else
vmrun="on"
fi
echo -e "$vname\t$vmrun\t$vmid\t$vmcpu\t$vmtime\t$vmweight\t$vmcap\t$vmstate\t$memory\t$res1 $res2 $res3 $res4\t$sizer1\t$sizer2\t$sizer3\t$sizer4\t$vncport"
done | gawk -F"\t" ' { printf("%-15s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-15s %-23s %-15s %-15s %-15s %-15s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) }'
rm -f $xmlist
rm -f $xmsched
Et ce que ca donne quand on l'execute...
suse1:/etc/xen/vm # domlist
On suse1
Name Status ID Vcpus Time Weight Cap State Memory Resources r1 size r2 size r3 size r4 size VNC-Port
win2K3_32_0 off 2 512 MB r0 8.00 GB No vnc
win2K3_32_1 off 2 512 MB r1 8.00 GB No vnc
win2K3_32_2 off 2 512 MB r2 8.00 GB No vnc
win2K3_32_3 off 2 512 MB r3 r6 8.00 GB 8.00 GB No vnc
win2K3_32_4 off 2 512 MB r4 8.00 GB No vnc
win2K3_32_5 off 2 512 MB r5 8.00 GB No vnc
win2K3_32_6 off 2 512 MB r7 r8 r9 8.00 GB 8.00 GB 8.00 GB No vnc
Hors ligne
#16 Le 25/01/2008, à 20:23
- freebird
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Là tu lui dis, quelle que soit le contenu, affiche le moi sur X caractères. Alors que ce soit court ou long ça fera toujours la même longueur (sauf si c'est plus long que la taille spécifiée). Tu devrais peut-être lire la doc de la commande printf, ça sera peut-être plus clair que mes explications
De rien pour le coup de main, c'est le but de ce forum
Un petit résolu dans le titre ?
Dernière modification par freebird (Le 25/01/2008, à 20:28)
Hors ligne
#17 Le 28/01/2008, à 10:55
- B@rtounet
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Je suis toujours sur la commande, et j'ai quelques petites précisions à te demander...
1-comment faire pour diminuer l'espace entre les colonnes,
2-comment ajouter des colonnes
Hors ligne
#18 Le 28/01/2008, à 11:34
- freebird
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Pour modifier l'espace il suffit de changer les nombres. Exemple, tu veux réduire la première colonne de 5 caractères tu remplaces :
gawk -F"\t" ' { printf("%-15s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-15s %-23s %-15s %-15s %-15s %-15s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) }'
par
gawk -F"\t" ' { printf("%-10s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-15s %-23s %-15s %-15s %-15s %-15s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) }'
Pour ajouter une colonne il faut que tu fasses 2 choses :
1 - modifier la ligne d'echo qui renvoi la valeur pour ajouter l'information que tu veux
2 - modifier le printf pour ajouter l'affichage de cette nouvelle valeur. Pour ça tu dois faire 2 ajouts dans la ligne. Le premier ajout pour dire le format de ta colonne et sa position. Le second ajout pour ajouter la nouvelle information. Exemple avec les modifications en gras :
gawk -F"\t" ' { printf("%-15s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-15s %-23s %-15s %-15s %-15s %-15s %-2s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16) }'
A toi de voir o๠tu veux ajouter la colonne et quelle sera la taille Dans mon exemple j'ai ajouté une 16ème colonne entre la 14ème et la 15ème.
Hors ligne
#19 Le 28/01/2008, à 11:44
- B@rtounet
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
ok mais le probleme, c'est que les titres au dessus ne suivent pas au niveau de l'espace des colonnes
apperement le
vname\t$vmrun\t$vmid\t$vmcpu\t$vmtime\t$vmweight\t$vmcap\t$vmstate\t$memory\t$res1 $res2 $res3 $res4\t$sizer1\t$sizer2\t$sizer3\t$sizer4\t$vncport
a chaque t y a une tabulation
Hors ligne
#20 Le 28/01/2008, à 11:57
- B@rtounet
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
appermeent il faut que je réduise mes titreaeu debut du script
le probleme est que mes titres de collonnes sont pas très bien gerables... je peux pas réduire l'espace par exemple entre id et vcpus..
"Name\t \tStatus\tID\tVcpus\tTime\tWeight\tCap\tState\tMemory\tResources\tsize\tsize\tsize\tsize\tVNC-Port"`
ce que je comprend pas c'est que les espaces sont pas les meme entre les titres alors qu'ils ont tous un seul t devant la commande
Dernière modification par B@rtounet (Le 28/01/2008, à 12:05)
Hors ligne
#21 Le 28/01/2008, à 12:53
- freebird
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Pour la partie titre tu devrais remplacer tes tabulations par des espaces. Tu pourras ainsi aligner avec tes données comme tu le souhaites.
Hors ligne
#22 Le 28/01/2008, à 13:35
- B@rtounet
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
je suis en train d'essayer de faire les titres aussi avec gawk et printf
Hors ligne
#23 Le 28/01/2008, à 13:48
- freebird
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Tu peux utiliser directement un printf vu que c'est aussi une commande. Tu l'utilises déjà pour les couleurs d'ailleurs
Hors ligne
#24 Le 28/01/2008, à 14:06
- B@rtounet
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
j'ai tout de meme du mal à comprendre...
#!/bin/bash
#DOMLIST
#Antony MARTINEAU
#Xen Virtual Machine Information by Antony MARTINEAU.
#Fonction pour afficher les echo en couleur
#31=rouge, 32=vert, 33=jaune,34=bleu, 35=rose, 36=cyan, 37= blanc
color()
{
printf '\033[%sm%s\033[m\n' "$@"
}
xmlist="/tmp/xmlistfic"
xmsched="/tmp/schedlist"
xmdomshow="/tmp/domshow"
dompath="/etc/xen/vm"
hostname=$(uname -n)
if test -f $xmdomshow
then
echo "$xmdomshow existe"
rm -f $xmdomshow
fi
if test -f $xmlist
then
echo "$xmlist existe"
rm -f $xmlist
fi
if test -f $xmsched
then
echo "$xmsched existe"
rm -f $xmsched
fi
xm list > $xmlist
xm sched-credit > $xmsched
echo `color 31 "On $hostname"`
echo -e `color 32 "Name\tStatus\tVcpus\tTime\tWeight\tCap\tState\tMemory\tResources\t-size-\t-size-\t-size-\t-size-\tVNC-Port"`|gawk -F"\t" ' { printf("%-17s %-5s %-2s %-7s %-7s %-7s %-7s %-7s %-15s %-7s %-7s %-7s %-7s %-7s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) }'
lines=$(cat /etc/xen/vm/*|grep "name"|cut -d'"' -f2| wc -l)
if [ -z $lines ]; then
lines=1
fi
for i in `seq 1 $lines`
do
vmname[$i]=$(cat $dompath/*|grep "name" |cut -d'"' -f2 |sed -n "$i{p;q;}")
vmres[$i]=$(cat $dompath/*|grep "#_r"|cut -d'"' -f2 | cut -d"#" -f2 | sed 's/_//' | sed 's/_/ /' |sed 's/_/ /' | sed 's/_/ /'| sed 's/_/ /' |sed -n "$i{p;q;}")
vname=${vmname[$i]}
res=${vmres[$i]}
pidvm=$(ps aux | grep -w qemu-dm |grep -w $vname | awk '{print $2}')
vmid=$(cat $xmlist | grep -w $vname | awk '{print $2}' | cut -d":" -f2)
vmcpu=$(cat $dompath/$vname | grep vcpus | cut -d"=" -f2)
vmstate=$(cat $xmlist | grep -w $vname | awk '{print $5}' | cut -d":" -f2)
vmtime=$(cat $xmlist | grep -w $vname | awk '{print $6}' | cut -d":" -f2)
vmweight=$(cat $xmsched | grep -w $vname | awk '{print $3}' | cut -d":" -f2)
vmcap=$(cat $xmsched | grep -w $vname | awk '{print $4}' | cut -d":" -f2)
lvname=$(echo $res | sed 's/r/vm/')
lvsize=$(lvdisplay 2> /dev/null | grep -B8 lv$i | grep Size | awk '{print $3}')
vmexist=$(cat $xmlist | grep $vname | awk '{print $1}')
vmresor=$(cat /etc/xen/vm/* | grep "#_r" |cut -d'"' -f2 | cut -d"#" -f2 | sed -n "$i{p;q;}")
res4=$( echo $vmresor | cut -d"_" -f5)
res3=$( echo $vmresor | cut -d"_" -f4)
res2=$( echo $vmresor | cut -d"_" -f3)
res1=$( echo $vmresor | cut -d"_" -f2)
vmmem=$empty
if [ ! -z $vmid ]; then
vmmem=$( cat $xmlist | grep -w $vname | awk '{print $3}' | cut -d":" -f2 |sed 's/$/MB/')
else
vmmem=$(cat $dompath/$vname | grep memory | cut -d"=" -f2 |sed 's/$/MB/')
fi
sizer1=$empty
if [ ! -z $res1 ]; then
lv1=$(echo $res1 | sed 's/r/lv/')
sizer1=$(lvdisplay 2> /dev/null | grep -A8 -w $lv1 | grep Size | awk '{print $3,$4}' | sed 's/ //')
else
res1=" "
fi
sizer2=$empty
if [ ! -z $res2 ]; then
lv2=$(echo $res2 | sed 's/r/lv/')
sizer2=$(lvdisplay 2> /dev/null | grep -A8 -w $lv2 | grep Size | awk '{print $3,$4}'| sed 's/ //')
else
res2=" "
fi
sizer3=$empty
if [ ! -z $res3 ]; then
lv3=$(echo $res3 | sed 's/r/lv/')
sizer3=$(lvdisplay 2> /dev/null | grep -A8 -w $lv3 | grep Size | awk '{print $3,$4}'| sed 's/ //')
else
res3=" "
fi
sizer4=$empty
if [ ! -z $res4 ]; then
lv4=$(echo $res4 | sed 's/r/lv/')
sizer4=$(lvdisplay 2> /dev/null | grep -A8 -w $lv4 | grep Size | awk '{print $3,$4}'| sed 's/ //')
else
res4=" "
fi
if [ -z $pidvm ]; then
vncport="No vnc"
else
vncport=$(netstat -anp | grep LIST | grep -w $pidvm | awk '{print $4}' | cut -d":" -f2 )
fi
if [ -z $vmexist ]; then
vmrun="off"
else
vmrun="on"
fi
echo -e "$vname\t$vmrun\t$vmid\t$vmcpu\t$vmtime\t$vmweight\t$vmcap\t$vmstate\t$vmmem\t$res1 $res2 $res3 $res4\t$sizer1\t$sizer2\t$sizer3\t$sizer4\t$vncport"
done | gawk -F"\t" ' { printf("%-12s %-1s %-7s %-7s %-7s %-7s %-7s %-7s %-7s %-15s %-7s %-7s %-7s %-7s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) }'
rm -f $xmlist
rm -f $xmsched
Name Status Vcpus Time Weight Cap State Memory Resources -size- -size- -size- -size- VNC-Port
win2K3_32_0 off 2 512MB r0 8.00GB No vnc
win2K3_32_1 off 2 512MB r1 8.00GB No vnc
win2K3_32_2 off 2 512MB r2 8.00GB No vnc
win2K3_32_3 off 2 512MB r3 r6 8.00GB 8.00GB No vnc
win2K3_32_4 off 2 512MB r4 8.00GB No vnc
win2K3_32_5 off 2 512MB r5 8.00GB No vnc
win2K3_32_6 off 2 512MB r7 r8 r9 r10 8.00GB 8.00GB 8.00GB 8.00GB No vnc
win2K3_32_7 off 2 512MB r11 r12 r13 r14 8.00GB 8.00GB 8.00GB 8.00GB No vnc
win2K3_32_8 off 2 1024MB r15 15.00GB No vnc
j'ai mis la deuxieme colonne au minimun (%1s) pourtant elle reste (vcpus =2 ) eloignée... je doit pas trop piger...
de plus je croyais qu'en mettant les meme valeur pour les titres et pour les collonne dans le gawk, le tout serait aligné, mais pas du tout...
il faut jouer sur les titres et sur les colonnes
car si j'ai bien compris...
si je met %15 dans le titre= la colonne commancant par name fera 15 caracteres soit "Name "
si je met %15 pour la premiere colone elle fera 15 caractere soit "win2K3_32_0 "
donc la colonne Name devrait avoir la meme taille
pourtant ce n'est pas aligné
en fait c'est qu'un espace n'est pas compté comme un caractère??,
Dernière modification par B@rtounet (Le 28/01/2008, à 14:16)
Hors ligne
#25 Le 28/01/2008, à 14:17
- freebird
Re : [Résolu] Donner des titres aux colonnes... dans un tableau
Ta seconde colonne c'est Status avec pour contenu "off", pour vcpus tu as 7 en longueur. Il faut prendre en compte la longueur de l'information aussi. Le chiffre que tu donnes et la taille minimum. Si dans une colonne tu mets "%1s" et que tu dois afficher "off" ça prendre 3 cases et non 1.
Dernière modification par freebird (Le 28/01/2008, à 14:19)
Hors ligne