#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
[[ "$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 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
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 Il faut rendre à César .....
Merci Beaucoup AnsuzPeorth ........... explication Digne de César !!!!....
^^ que d'éloges
@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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
^^ que d'éloges
Vivi ...ca flatte mon ego surdimensionné ....!
A titre d'info :
Tu risques de faire peur avec un exemple pareil..... Mais c'est très instructif, comme d'hab
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