Pages : 1
#1 Le 17/12/2013, à 10:23
- tdc63
Je bloque sur sed
une commande découpant un fichier
awk -F: '{if (($3<300000) && ($3>100000) && ($3!=202963) && ($3!=202966) && ($3!=208700)) print $3"-"$1}'
me renvoie en variable ceci :
var=112138-aaaaa_zzzz.rrr63/215160-bb_ccc.hhhhhh/108396-eeee_bbb.azerty-ytreza/212406-dd_gggg63
et je voudrais arriver à ceci
var1= 112138
var2= 215160
var3= 108396
var4= 212406
J'ai bien tenté ça :
var=112138-aaaaa_zzzz.rrr63/215160-bb_ccc.hhhhhh/108396-eeee_bbb.azerty-ytreza/212406-dd_gggg63
IFS=/
read var1 var2 var3 var4 < <(echo "$var" | sed -e "s/[a-z]//g" )
echo
echo var1= "$var1"
echo var2= "$var2"
echo var3= "$var3"
echo var4= "$var4"
echo
mais je bloque sur les caractères " - _ . " et les derniers chiffres en bout de ligne
var1= 112138-_.63
var2= 215160-_.
var3= 108396-_.-
var4= 212406-_63
Merci de votre aide
Hors ligne
#2 Le 17/12/2013, à 10:41
- claudius01
Re : Je bloque sur sed
Bonjour,
Avec cut (appliquée ici sur une seule ligne) cela donne :
$ echo "var=112138-aaaaa_zzzz.rrr63/215160-bb_ccc.hhhhhh/108396-eeee_bbb.azerty-ytreza/212406-dd_gggg63" | cut -d'-' -f1
var=112138
Claudius
--
Cordialement, A+
Hors ligne
#3 Le 17/12/2013, à 10:55
- Postmortem
Re : Je bloque sur sed
Salut,
read var1 var2 var3 var4 < <(sed -r 's#([0-9]*)[^/]*/([0-9]*)[^/]*/([0-9]*)[^/]*/([0-9]*).*#\1 \2 \3 \4#' <<< "$var")
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#4 Le 17/12/2013, à 11:23
- tdc63
Re : Je bloque sur sed
@ claudius01
Avec cut (appliquée ici sur une seule ligne) cela donne :$ echo "var=112138-aaaaa_zzzz.rrr63/215160-bb_ccc.hhhhhh/108396-eeee_bbb.azerty-ytreza/212406-dd_gggg63" | cut -d'-' -f1 var=112138
Effectivement j'y avais pensé mais seulement 112138 est renvoyé. Moi je voudrais avoir mes 4 codes 112138, 215160,108396 et 212406 pour pouvoir les passer chacun en 4 variables
@ Postmortem
read var1 var2 var3 var4 < <(sed -r 's#([0-9]*)[^/]*/([0-9]*)[^/]*/([0-9]*)[^/]*/([0-9]*).*#\1 \2 \3 \4#' <<< "$var")
Voila mon retour console
var1= 112138 215160 108396 212406 var2= var3= var4=
et idem, là je n'ai qu'une variable qu'il va falloir que je redécoupe en 4
Merci à vous 2
Hors ligne
#5 Le 17/12/2013, à 11:28
- Postmortem
Re : Je bloque sur sed
Chez moi ça fonctionne :
$ var=112138-aaaaa_zzzz.rrr63/215160-bb_ccc.hhhhhh/108396-eeee_bbb.azerty-ytreza/212406-dd_gggg63
$ read var1 var2 var3 var4 < <(sed -r 's#([0-9]*)[^/]*/([0-9]*)[^/]*/([0-9]*)[^/]*/([0-9]*).*#\1 \2 \3 \4#' <<< "$var")
$ echo "var1=$var1 ; var2=$var2 ; var3=$var3 ; var4=$var4"
var1=112138 ; var2=215160 ; var3=108396 ; var4=212406
Tu n'aurais pas laissé la modification de l'IFS dans ton script ?
Edit :
Ça vient bien de la modif de ton IFS :
$ IFS=/
$ read var1 var2 var3 var4 < <(sed -r 's#([0-9]*)[^/]*/([0-9]*)[^/]*/([0-9]*)[^/]*/([0-9]*).*#\1 \2 \3 \4#' <<< "$var")
$ echo "var1=$var1 ; var2=$var2 ; var3=$var3 ; var4=$var4"
var1=112138 215160 108396 212406 ; var2= ; var3= ; var4=
Dernière modification par Postmortem (Le 17/12/2013, à 11:33)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#6 Le 17/12/2013, à 11:32
- claudius01
Re : Je bloque sur sed
Ok, et en complétant le script initial par ledit 'cut' :
var=112138-aaaaa_zzzz.rrr63/215160-bb_ccc.hhhhhh/108396-eeee_bbb.azerty-ytreza/212406-dd_gggg63
IFS=/
read var1 var2 var3 var4 < <(echo "$var" | sed -e "s/[a-z]//g" )
echo
echo var1= "$var1" | cut -d'-' -f1
echo var2= "$var2" | cut -d'-' -f1
echo var3= "$var3" | cut -d'-' -f1
echo var4= "$var4" | cut -d'-' -f1
echo
... cela devrait répondre au problème ?
Hors ligne
#7 Le 17/12/2013, à 11:38
- tdc63
Re : Je bloque sur sed
Merci à tous les 2 !!!
Les deux solutions fonctionnent et j'avoue que j'ai eu un peu de fainéantise intellectuelle avec l'IFS.
Merci encore.
Hors ligne
#8 Le 19/12/2013, à 10:12
- tdc63
Re : Je bloque sur sed
Bjr, c'est RE-moi
Dernière modif en date, maintenant je ne sais pas combien d'argument vont être cochés et je ne peux pas me limiter à 4.
En fait je souhaite récupérer l'identifiant des groupes dans /etc/group sauf ceux cocher dans ma checklist, j’exclue donc de mon tri 1,2,3,etc,... variables possibles.
Ces variables seront ensuite comparées avec le GID de /etc/passwd excluant ainsi les utilisateurs que je souhaite conserver sur le serveur.
Explication un peu confuse peut-etre mais j'ai du mal à mocaliser En tout cas dans ma tête c'est clair !
#!/bin/bash
CU=$(zenity --list --checklist \
--title "A T T E N T I O N" \
--text "Sélectionner les Codes à ne pas afficher" \
--height "400" \
--width "500" \
--separator=":" \
--print-column=ALL \
--column="" \
--column="C.U." $(awk -F: '{if (($3<300000) && ($3>100000) && ($3!=202963) && ($3!=202966) && ($3!=208700)) print"FALSE " $3"/"$1}' /etc/group))
echo;echo " CU CHOISIS"
echo $CU
IFS=:
read var1 var2 var3 var4 var5..."etc....." < <(echo "$CU" | sed -e "s/[a-z]//g" )
echo
echo var1= "$var1" | cut -d'/' -f1
echo var2= "$var2" | cut -d'/' -f1
echo var3= "$var3" | cut -d'/' -f1
echo var4= "$var4" | cut -d'/' -f1
echo var5= "$var5" | cut -d'/' -f1
"etc... etc..."
Hors ligne
#9 Le 19/12/2013, à 10:47
- claudius01
Re : Je bloque sur sed
Bonjour,
Accueillir une boucle qui encadre le read et la construction de chaque var_n=
Dans cette boucle, "grignoter" jusqu'à la dernière occurrence du '/'
Cordialement, A+
--
Claudius
Hors ligne
#10 Le 19/12/2013, à 11:04
- tdc63
Re : Je bloque sur sed
Ok je planche là-dessus...
mais vous éloignez pas trop de vos claviers : j'suis pas trop doué
Hors ligne
#11 Le 19/12/2013, à 11:36
- claudius01
Re : Je bloque sur sed
Ok ;-)
J'ai proposé boucle mais les pro lui préférons une ligne avec un appel à awk voire à sed...
Dernière modification par claudius01 (Le 19/12/2013, à 13:12)
Hors ligne
#12 Le 20/12/2013, à 11:37
- Postmortem
Re : Je bloque sur sed
Salut,
Si j'ai bien compris, plutôt que d'utiliser de simples variables, tu pourrais utiliser un tableau.
Par exemple :
$ IFS=: read -a var <<< "tata:tete:titi:toto"
$ echo "var[0]=${var[0]}"
var[0]=tata
$ echo "var[1]=${var[1]}"
var[1]=tete
$ echo "var[2]=${var[2]}"
var[2]=titi
$ echo "var[3]=${var[3]}"
var[3]=toto
Tu peux ensuite boucler sur les éléments de ce tableau comme ça :
for element in "${var[@]}"
do
echo "$element"
done
Ou comme ça :
for index in "${!var[@]}"
do
echo "var[$index]=${var[$index]}"
done
Sinon, dans ton script, lorsque tu modifies la variable IFS, il faut penser à la restaurer ensuite sinon, tu risques d'avoir des comportements inattendus. Donc, en repartant de ton script, soit tu fais ainsi :
old_IFS=$IFS
IFS=:
read var1 var2 var3 var4 var5..."etc....." < <(echo "$CU" | sed -e "s/[a-z]//g" )
IFS=$old_IFS
Ou alors, tu ne modifies l'IFS que pour la commande qui en a besoin en faisant :
IFS=: read var1 var2 var3 var4 var5..."etc....." < <(echo "$CU" | sed -e "s/[a-z]//g" )
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
Pages : 1