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

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 tongue En tout cas dans ma tête c'est clair ! lol

#!/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é smile

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