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

Re : [Résolu] Donner des titres aux colonnes... dans un tableau

Pas d'idée?

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

B@rtounet a écrit :

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 wink

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

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 yikes ) :

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é wink
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 big_smile

De rien pour le coup de main, c'est le but de ce forum wink

Un petit résolu dans le titre ? tongue

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

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