[Bash] Afficher la sortie de plusieurs variables en tableau

Coucou à tous,

Je reviens encore avec mes questions de débutant en script bash ^^

Je chercherais à faire une sorte de mise en page d’une sortie d’un script…je m’explique.
Je liste tout les répertoire d’un dossier de partage, trouve à quel groupe il appartient et les droit en vigueur dessus.
Une fois le résultat de chacun de ces éléments j’aimerai qu’il s’affiche de la façons suivante:

Ligne1_de_ma_VAR1    Ligne1_de_ma_VAR2    Ligne1_de_ma_VAR3
Ligne2_de_ma_VAR1    Ligne2_de_ma_VAR2    Ligne2_de_ma_VAR3
Ligne3_de_ma_VAR1    Ligne3_de_ma_VAR2    Ligne3_de_ma_VAR3
Ligne4_de_ma_VAR1    Ligne4_de_ma_VAR2    Ligne4_de_ma_VAR3
[...]

Déjà es-ce possible en bash ?

Si oui devrais-je faire cela avec un for ?

Genre:

for i in $(echo $VAR1); do echo $(for y in $(echo VAR2); do echo $y;done); done
(ça à pas l’air très juste ^^)

Ou plutôt avec une boucle qui m’afficherai ligne par ligne les élément 1 à n de chacune de mes variable consécutivement ?

Merci :slightly_smiling:

[EDIT]

Ne devrais-je pas plutôt envoyer le tout dans une variable/tableau et ensuite afficher le tintouin ?

Mais le problème reste le même il me semble ^^

C’est pas trés clair, mais AMA, ce que tu cherches, c’est awk:
linuxfocus.org/Francais/Septembe … le103.html
lea-linux.org/cached/index/Dev-awk.html

Glups !

AWK mais c’est compliquer ça ! Et je n’y connais rien, si ce n’est awk -F "mon_délimiteur" ‘{print$1;$2…}’ :blush:

Y’a pas plus simple genre qui peut s’apprendre en quelques heures ^^

quote="Ludo"
AWK mais c’est compliquer ça !
(…)[/quote] C’est un peux dur, mais c’est incontournable en shell, et ce que je t’ai indiqué c’est des trucs basiques, pour que tu puisses t’y mettre vite.

Awk est riche, peut etre trop quand on debute. Par contre une fois que tu connais les commandes dont tu as besoin, il est vraiment tres puissant.

Pour ce que tu veux faire, ton print suffit. Ou alors tu utilises printf, accessible egalement en shell et qui utilise la meme syntaxe que le printf du C.

Si tu veux des colonnes parfaitement alignees, par contre tu peux passer par latex comme c’est montre dans la doc de mattotop. Mais c’est peut etre un peu trop :laughing:

[quote=“gbx”]
Si tu veux des colonnes parfaitement alignees, par contre tu peux passer par latex comme c’est montre dans la doc de mattotop. Mais c’est peut etre un peu trop :laughing:[/quote]

Bah plutôt que latex je génère une page html ^^

bien vu l’html! j’y ai meme pas pense alors que c’est ce qu’on utilise au boulot :slightly_smiling:
enfin je suppose que ton probleme est resolu puisqu’il n’y a pas de retour negatif…

Houla non !

Le but de ce script est de faire une liste des dossier d’un répertoire définis, d’afficher les permissions du groupe, lister les personnes du groupes (login) les transformer en Prénom, Nom en interrogeant l’annuaire ldap.

Donc je doit faire que chaque variable de mon script me sort sous forme de tableau chaque élément de mes variables. J’ai été conseiller par ceci sur DLFP ( tldp.org/LDP/abs/html/arrays.html ) mais le bash du serveur est 2.5. Enfin j’ai déja les commande pour les variables…

Reste à finir l’usine à gaz :smiley:

p.s.: je laisse le sujet en non-résolu dès fois que l’ont me propose une solution autre que AWK car j’ai beau relire le trucs dans tout les sens ca me parle vraiment pas et le déclic ne se fait pas :’(

En fait awk te permet de faire du traitement de donnees ligne par ligne
par exemple si tu as un script qui te donne des valeurs sous cette forme :
nom_dossier permissions user1 user2 user3…

tu peux faire :

pour avoir un apercu de comment sont traitees tes donnees

note : $0 contient toute la ligne, les champs separes sont numerotes de 1 a NF et non de 0 a NF-1 comme en C

apres tu fais un script awk (commencant par #! /bin/awk -f)
dont voila la structure :

BEGIN{bloc a executer avant le traitement generique} {for (i=1;i<=NF; i++){printf $i "separateur"}printf "fin_de_ligne"} END {bloc a executer a la fin}
comme ca avec des printf tu peux generer ton fichier html facilement avec

si avec ca tu vois toujours pas comment faire, y a perl mais c’est plus lourd

quote="gbx"
si avec ca tu vois toujours pas comment faire, y a perl mais c’est plus lourd[/quote] J’allais le dire, mais perl étant un basé sur un mix du shell, de sed, awk, et plus, autant bien identifier le fonctionnement des composants de base pour mieux comprendre ce qui se passe, AMA.

Malheureusement je n’ai pas le temps pour la première version de ce script de m’attarder sur AWK, je suis en train d’étudier le Perl mais lentement car je fait ça le week-end.

J’ai donc bricoler une solution pour afficher mes éléments, en sachant que le nombre d’élément de mes variables est identique. J’ai utilisé ceci:

FOLDER_ALL=$($LS -lRn $path | $GREP ^d)

GRP_TRSL=$(for i in $($ECHO "$FOLDER_ALL" | $AWK -F " " '{print$4}'); do $GETENT group $i | cut -d: -f1; done)

PERM_GRP=$($ECHO "$FOLDER_ALL" | $CUT -d\  -f1)

LIST_FOLDER=$(for i in $(find $path -type d | $SED -e 's/\ /_/g'); do $ECHO "$i <br>"; done)

GRP_TRSL_TAB=$(for i in $($ECHO "$GRP_TRSL" | $SED -e 's/\ /_/g'); do $ECHO "$i <br>"; done)

PERM_GRP_TAB=$(for i in $($ECHO "$PERM_GRP"); do $ECHO "$i <br>"; done)



# Send data in html file
touch /root/folders-rules.html

cat > /root/folders-rules.html <<EOF
<TABLE BORDER="1" style="text-align: left">
  <CAPTION>Table of share with the name of folder, groups and permition</CAPTION>
  <TR><b>
        <TH><h2>Folder path</h2></TH>
        <TH><h2>Name of Group</h2></TH>
        <TH><h2>Permition</h2></TH>
        </b>
  </TR>
  <TR>
        <TH>$LIST_FOLDER</TH>
        <TH>$GRP_TRSL_TAB</TH>
        <TH>$PERM_GRP_TAB</TH>
  </TR>
</TABLE>
EOF

Je doit avouer que c’est un beau brouillon bien crado, mais bon la sortie donne ce que je veut et en peut de temps ^^

C’est clair que apprendre AWK serais plus gracieux mais je doit rendre un résultat rapidement, pour éventuellement me pencher sur un script plus lourd et mieux fait…Ce qui me laissera bien le temps d’apprendre AWK ^^

Et la beaute fonctionnelle ? :wink: Puis il est pas si crade que ca, les etapes sont clairement marquees.

A part ca, je te donne mon idee pour Awk :


BEGIN{
printf "<TABLE BORDER=\"1\" style=\"text-align: left\">\n"
printf "\t<CAPTION>Table of share with the name of folder, groups and permissions</CAPTION>"
printf "\t<TR><b>\n"
printf "\t\t<TH><h2>Folder path</h2></TH>\n"
printf "\t\t<TH><h2>Name of Group</h2></TH>\n"
printf "\t\t<TH><h2>Permissions</h2></TH>\n"
printf "\t\t</b>\n"
printf "\t</TR>\n"
}

/^d/{
name = $NF
split ($4, owner_and_group,":")
split ($0, permissions, "\\" )
printf "\t<TR>\n"
printf "\t\t<TH>%s</br></TH>\n", name
printf "\t\t<TH>%s</br></TH>\n", owner_and_group[2]
printf "\t\t<TH>%s</br></TH>\n", permissions[2]
printf "\t</TR>\n"
}

END{printf "</TABLE>\n"}

et tu l’appelle avec la commande

(ls -lRn $path | awk -f nom_du_script) > page.html

c’est pas teste sous debian, la chuis au boulot, mais l’idee est la.
J’espere que ca va aider pour le declic :smiley:

Vous le saviez déjà, vous aviez raison il faut que je passe par AWK, mon petit script était prêt, il fonctionnait très bien dans ma petite arborescence de test…Puis voila que je le lâche dans l’environnement en production et PAF, plus de 65535 donnée donc plantage…je devoir me résigner à apprendre AWK…

Enfin rien n’est perdu vu que j’ai un ralongement du temps pour cette tâche :slightly_smiling:

cat $INPUT | awk -F";" '{ print $1" "$2 }' | while read VAR do ton traitement;;; done