Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1 Le 26/03/2010, à 22:51

UUBBUU_USER

[ Résolu ]-Bash - traitement de 2 liste

Salut ..
Voila .. je cherche a comparer  list_fstab . à list_system .....

list_system="/ /bin /boot /dev /etc /lib /lost+found /opt /proc /root /sbin /selinux /srv /usr /var /sys /home"

list_fstab=`cat /etc/fstab | sed '/^#/d' | while read line; do set $(echo $line); echo $2; done | sed '/none/d' | sed '/cdrom/d'`

En gros je souhaite que tous les éléments qui se trouve dans ma list_fstab et qui sont également dans ma list_system  soit supprimer ..
Pour qu'il ne reste dans ma list_fstab que des éléments non répertoriés ...
J'ai cherché du coté de diff .... sans succès ..

diff $list_fstab $list_system
diff: opérande supplémentaire « /media/sdb1 »
diff: Pour en savoir davantage, faites: « diff --help ».

j'ai aussi essayer avec différentes boucles sans réel succès ..
Voila .. merci pour quelqu' on que propositions ou bien conseil !!!

Dernière modification par UUBBUU_USER (Le 27/03/2010, à 04:15)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#2 Le 27/03/2010, à 00:40

AnsuzPeorth

Re : [ Résolu ]-Bash - traitement de 2 liste

Bjr,
Vérifie dans ta boucle !
Un truc du genre : (tout pourrait être fait avec awk, mais je maitrise pas du tout !)

#! /bin/bash
list_system="/ /bin /boot /dev /etc /lib /lost+found /opt /proc /root /sbin /selinux /srv /usr /var /sys /home"
list_fstab=
while read ligne
do
[[ "$ligne" =~ none ]] || [[ "$ligne" =~ cdrom ]] && continue
[[ "$list_system" =~ "$ligne" ]] || list_fstab="$list_fstab $ligne"
done < <(grep -v '^#' /etc/fstab | awk '{print $2}')
exit

Il y aura un espace au début de la liste_fstab, à supprimer si besoin !

Dernière modification par AnsuzPeorth (Le 27/03/2010, à 00:44)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#3 Le 27/03/2010, à 01:15

UUBBUU_USER

Re : [ Résolu ]-Bash - traitement de 2 liste

Nikel !!
ça Marche "Impec"
Merci AnsuzPeorth
..par contre 2 ou trois question .....
Peut tu m'expliquer ( Je comprend  vu que tu a répondu à ma demande ...  ) mais je reste dubitatif   

[[ "$ligne" =~ none ]] || [[ "$ligne" =~ cdrom ]] && continue
[[ "$list_system" =~ "$ligne" ]] || list_fstab="$list_fstab $ligne"
done < <(grep -v '^#' /etc/fstab | awk '{print $2}')

ps : merci d'avance !!! 
psbis:  jpense pas être le seul a qui ça peut rendre service !!


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#4 Le 27/03/2010, à 03:36

AnsuzPeorth

Re : [ Résolu ]-Bash - traitement de 2 liste

Bon aller, je prends mon courage à 2 mains !

Ce genre de syntaxe est souvent utilisé par les cadors en bash du forum programmation (totor, nesthib, sputnick ...),regarde leurs interventions (très fréquentes) tu apprendras beaucoup !

Mais bon, j'ai plus vite fait de t'expliquer que de trouver les liens des posts en question...!

En gros, avec certainement les termes techniques non appropriés ...

while read ligne
do
...
done < <(grep -v '^#' /etc/fstab | awk '{print $2}')

C'est une redirection de processus, cela équivaut a:

grep -v '^#' /etc/fstab | awk '{print $2}' | while read ligne
do
...
done

L'avantage de la redirection, c'est que les variables crées dans la boucle seront visibles hors de cette boucle (une histoire de pipe, sous processus et portée d'une variable), et puis c'est plus jolie smile

[[ "$ligne" =~ none ]] || [[ "$ligne" =~ cdrom ]] && continue

Si none est dans la ligne OU cdrom, continue ( sauter directement à la ligne suivante). Cela aurait même pu s'écrire:

[[ "$ligne" =~ none|cdrom ]] && continue

Les 3 lignes suivantes ont le même résultat

[[ "$ligne" =~ none ]]
echo $ligne | grep none
grep none <<< $ligne

Sauf que la première ligne est du full-bash, donc plus rapide !
Compare avec la deuxième, 2 commandes un pipe ...
La 3, une commande et une redirection.

Au sujet des redictions:
<<< redirige une variable
< redirige un fichier
< <( commande ) Pas besoin d'explications !


Voilà, finalement, ca été rapide !

Alors, si j'ai dit des bêtises, n'hésitez surtout pas à me reprendre ...

PS: Juste pour dire, tout ça, c'est maître Totor qui me l'a appris smile Il faut rendre à César .....


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#5 Le 27/03/2010, à 04:12

UUBBUU_USER

Re : [ Résolu ]-Bash - traitement de 2 liste

Merci Beaucoup AnsuzPeorth ........... explication Digne de César !!!!....
Il est vrai que la syntaxe poussé  en bash n'est  pas le commun des utilisateurs lambda ...
Il est toujours agréable de se voir aider ....

[[ "$ligne" =~ none ]]

je connaissait pas .... en effet çela clarifie et simplifie pas mal le code ( ça evite d'imbriquer pas mal de commande )

[[ "$ligne" =~ none ]] || [[ "$ligne" =~ cdrom ]] && continue

je connaissais pas "&& continue"
et pour les redirections ... j'ai pas encore vraiment pousser l ' aventure ...
En tout cas Merci encore pour ces petites précisions .....


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#6 Le 27/03/2010, à 11:55

nesthib

Re : [ Résolu ]-Bash - traitement de 2 liste

AnsuzPeorth a écrit :

Ce genre de syntaxe est souvent utilisé par les cadors en bash du forum programmation (totor, nesthib, sputnick ...),regarde leurs interventions (très fréquentes) tu apprendras beaucoup !

[…]

PS: Juste pour dire, tout ça, c'est maître Totor qui me l'a appris smile Il faut rendre à César .....

UUBBUU_USER a écrit :

Merci Beaucoup AnsuzPeorth ........... explication Digne de César !!!!....

^^ que d'éloges wink

@UUBUU_USER : c'est vrai que la syntaxe bash est un peu ésotérique mais avec un peu de courage on arrive vite à faire des trucs sympas ! (perso je ne peux plus m'en passer).


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#7 Le 27/03/2010, à 13:44

Totor

Re : [ Résolu ]-Bash - traitement de 2 liste

A titre d'info :

join -v 1 <(awk ' ! ( /^#/  ||  /none|cdrom/) {print $2}'  /etc/fstab > >(sort)) <(cat <<EOF
/
/bin
/boot
/dev
/etc
/lib
/lost+found
/opt
/proc
/root
/sbin
/selinux
/srv
/sys
/usr
/var
/home
EOF)

-- Lucid Lynx --

Hors ligne

#8 Le 27/03/2010, à 13:55

AnsuzPeorth

Re : [ Résolu ]-Bash - traitement de 2 liste

nesthib a écrit :

^^ que d'éloges wink

Vivi ...ca flatte mon ego surdimensionné ....! smile

Totor a écrit :

A titre d'info :

Tu risques de faire peur avec un exemple pareil..... Mais c'est très instructif, comme d'hab wink


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#9 Le 27/03/2010, à 16:55

UUBBUU_USER

Re : [ Résolu ]-Bash - traitement de 2 liste

Salut  ToTor, et nesthib .. et merci Beaucoup pour cet exemple ...
Je ne connaissais pas du tout "join -v 1 " ( Outil de fusion sur deux fichier  Ici, .pour chaque paire de ligne commune .. n'affiche qu'une seule en sortie  et travaille sur le fichier  1  )
( Oui  je sais pas si c'est très compréhensible pour les lecteurs ....   Mais je m'efforce ..
Au pire  un simple   " join --help  ".
asuzpeorth ... venais de m'expliquer   la redirection  "<(..)"  .. donc là c'est bon ..
" ! ( /^#/  ||  /none|cdrom/) "  Pour l'omission de certaine ligne avec awk je ne savais pas du tout ....
" > >(sort)) "  .. heu !!   la j'ai pas bien compris ....
Et l'utilisation de EOF .. je la comprend sans vraiment la maitriser ..
Aurrions-nous put remplacer le EOF par  <( cat $list_system  ) ...  Ou bien le retour a la ligne des  valeurs est important ????


edit1:
en remplaçant par  <( echo $list_system  )   .. cela fonctionne  ...
Mais par contre et la version avec EOF et celle avec echo $list_sytem .. me renvoie  des erreurs ... /proc et /home avec  echo $list_system .. et  juste /home avec le EOF ...   Alors que je ne devrait avoir que les points de montages non vital au système ....( donc qui ne sont pas dans ma première liste !!)
En tout cas  la version de asuzpeorth avec la boucle  fonctionne !!!..
César va t il est détronné ????

Dernière modification par UUBBUU_USER (Le 27/03/2010, à 19:19)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#10 Le 27/03/2010, à 21:28

Totor

Re : [ Résolu ]-Bash - traitement de 2 liste

Bonsoir,

Désolé, je t'ai effectivement donné quelque chose d'erroné. Je suis allé un peu vite sur un seul point. Je te laisse trouver lequel (par évident à trouver juste en lisant ma réponse... consulte le man de join) :

join -v 1 <(awk ' ! ( /^#/  ||  /none|cdrom/) {print $2}'  /etc/fstab > >(sort)) <(cat <<EOF
/
/bin
/boot
/dev
/etc
/home
/lib
/lost+found
/opt
/proc
/root
/sbin
/selinux
/srv
/sys
/usr
/var
EOF)

Explications :
> >(sort) : Permet de trier le flux renvoyé par l'instruction awk

Aurrions-nous put remplacer le EOF par <( cat $list_system  ) ...

Non

en remplaçant par  <( echo $list_system  )  .. cela fonctionne  ...

ça m'étonnerai beaucoup...

Ou bien le retour a la ligne des  valeurs est important ????

oui
Si je n'ai pas mis <( cat $list_system  ), c'est pour une raison bien simple : il faut que chacun des éléments soient sur une ligne distincte.

Ici, .pour chaque paire de ligne commune .. n'affiche qu'une seule en sortie  et travaille sur le fichier  1

Pas tout à fait : justement, le -v permet de n'afficher que ce qui est dans le fichier n°1 et pas dans le fichier n° 2


Si tu tiens absolument à travailler avec une liste :

list_system=( / /bin /boot /dev /etc /home /lib /lost+found /opt /proc /root /sbin /selinux /srv /sys /usr /var )
join -v 1 <(awk ' ! ( /^#/  ||  /none|cdrom/) {print $2}'  /etc/fstab > >(sort)) <(echo -e ${list_system[@]/%/\\n})

EDIT : je viens de remarquer une erreur :
tu voulais probablement mettre echo $list_system et non cat $list_system (c'est d'ailleurs ce que tu as indiqué dans ton edit)

Dernière modification par Totor (Le 27/03/2010, à 21:33)


-- Lucid Lynx --

Hors ligne

#11 Le 28/03/2010, à 00:57

UUBBUU_USER

Re : [ Résolu ]-Bash - traitement de 2 liste

SAlut .. merci pour ces petites précisions ....
en effet de cette manière ça marche sans erreur ..
Je cherche à travailler à partir d'une liste, car cette liste devrait être fixe . Elle comportera tous les dossiers vitaux au système
Merci pour les précisions à propos de join ... ( pour ne pas écrire de bêtises j'avais regarder le manpage )
Par contre Si jamais tu repasse par le topic ....  Peux tu m'expliquer les  "raccourcis" utilisés

<(echo -e ${list_system[@]/%/\\n})

Merci en Tout Cas  !!!
ps: ansuzpeorth  .. n'empêche ta solution marchais bien ^^
C'est sur  avec Awk   ç'est toujours plus clean et plus Pro ^

Dernière modification par UUBBUU_USER (Le 28/03/2010, à 00:58)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#12 Le 28/03/2010, à 17:43

Totor

Re : [ Résolu ]-Bash - traitement de 2 liste

Bonsoir,

La syntaxe $[variable[@]} permet de référencer l'ensemble des éléments d'un tableau dont le nom est variable

La syntaxe ${variable/<pattern>/<valeur>} permet de remplacer la première occurence de <pattern> par <valeur> dans variable. Il y a aussi la notation ${variable//<pattern>/<valeur>} où toutes les occurences seront remplacées.

Lorsque <pattern> commence par %, le <pattern> doit se trouver à la fin de variable.
(Lorsque <pattern> commence par #, le <pattern> doit se trouver au debut de variable)

Ici, <pattern> = %, on référence donc uniquement la fin de variable.
Et comme on utilise un tableau, le remplacement sera effectué à la fin de chaque valeur du tableau.
On remplace par \n (le double \\ permet de "protéger" l'\), c'est à dire un retour à la ligne.
En résumé, on ajoute un retour à la ligne à la fin de chacun des éléments du tableau "list_system"

EDIT (précision) : le remplacement ne modifie pas le tableau. Il n'est effectué que sous forme de résultat.

Dernière modification par Totor (Le 28/03/2010, à 17:44)


-- Lucid Lynx --

Hors ligne

Haut de page ↑