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 07/03/2014, à 15:12

Rob414

[RESOLU]AWK et script shell

Bonjour,

afin de me faciliter le boulot, je créé des petits scripts en shell unix, en toute modestie car je suis loin d'avoir un bon bagage sur le sujet.

Donc voici l'objet de ma demande:

lorsque je tape en ligne de commande la ligne ci dessous, en remplaçant, bien sur, les variable $DAT et $NOMLot par leur vrai valeur, ça marche
mais dés que je l'inscrit dans mon programme ça ne fonctionne pas, à priori la variable $0 est interprétée par le shell et non comme une variable awk, donc en l'occurrence de m'afficher les lignes trouvées.
ls -rtl /data/AUXB/iecc/data*/stockage/ |sed -e '/$DAT/!d; /$NOMLot*/!d' |awk -F "." '!x[$3]++ {print $0}'

Comment faire ?
j'ai cherché mais rien que je ne sache interpréter avec mon niveau de connaissance en la matière.

Merci.

Dernière modification par Rob414 (Le 03/04/2014, à 15:12)

Hors ligne

#2 Le 07/03/2014, à 15:39

tiramiseb

Re : [RESOLU]AWK et script shell

Salut,

Dans une chaîne avec des guillemets simples, les noms de variables ne sont pas résolus.

Autrement dit, avec « 'toto $TOTO toto' » alors $TOTO n'est pas remplacé par le contenu de la variable TOTO, alors qu'avec « "toto $TOTO toto" » la valeur de $TOTO est bien mise à la place de la chaîne $TOTO.

Tu utilises des guillemets simples pour encadrer tes chaînes de sed et de awk. As-tu essayé de les remplacer par des guillemets doubles « " » ?

Hors ligne

#3 Le 07/03/2014, à 16:42

Rob414

Re : [RESOLU]AWK et script shell

J'ai essayé (dans le contexte de mon script) :
ls -rtl /data/AUXB/iecc/data*/stockage/ |sed -e "/$DAT/!d; /$NOMLot*/!d" |awk -F "." "!x[$3]++ {print $0}"

mais la réponse est:
Erreur de syntaxe La ligne source est 1.
Le contexte de l'erreur est
                 >>> !x[] <<<
awk : 0602-500 Quitter La ligne source est 1.

Hors ligne

#4 Le 07/03/2014, à 16:45

Rob414

Re : [RESOLU]AWK et script shell

Je détail mon script au cas où :
#!/bin/sh
echo " Donner ici les premiers caractères du nom du lot :\c"
read NOMLot
DAT=$(date |awk '{print $2" "$3}')
ls -rtl /data/AUXB/iecc/data*/stockage/ |sed -e "/$DAT/!d; /$NOMLot*/!d" |awk -F "." "!x[$3]++ {print $0}"

Hors ligne

#5 Le 07/03/2014, à 18:38

tiramiseb

Re : [RESOLU]AWK et script shell

Alors là, pour la syntaxe de awk je suis nul.
Le mieux serait que pingouinux passe dans le coin, lui il est fort pour ces choses-là...

Hors ligne

#6 Le 07/03/2014, à 18:40

pingouinux

Re : [RESOLU]AWK et script shell

Salut,
J'étais justement en train de regarder. Peut-être ceci :

DAT=$(date +"%b %e")
ls -rtl /data/AUXB/iecc/data*/stockage/ | awk -F "." '{if(!/'"$DAT"'/&&!/'"$NOMLot"'/){if(!x[$3]++) {print $0}}}'

Édité :
Je crois que j'ai fait le test à l'envers. Si j'ai bien compris, il faut garder les lignes contenant "$DAT" et "$NOMLot". J'en profite pour simplifier.

ls -rtl /data/AUXB/iecc/data*/stockage/ |  awk -F "." "/$DAT/&&/$NOMLot/"'{if(!x[$3]++) {print $0}}'

Dernière modification par pingouinux (Le 07/03/2014, à 19:30)

Hors ligne

#7 Le 10/03/2014, à 11:45

Rob414

Re : [RESOLU]AWK et script shell

Bonjour à tous les deux et merci de vous être intéressé à mon probleme.

Alors, Pingouinux, ben je suis désolé mais la première formule ne fonctionne pas du tout car j'ai le retour complet de la commande LS -rtl comme si rien de préciser pour la restriction et pour la deuxieme formule j'ai effectivement une restriction sur les noms de fichiers mais pas en date du jour.

Je reconnais qu'il n'est pas aisé de résoudre un script sans savoir ce qu'il en retourne précisément .
Donc je vais tenter d'expliquer ma problématique:
Pour commencer , je met ci dessous mon script complet les XXXXXX remplaçant le nom de machine (sécurité oblige) et en expliquant :
$ cat recherche_LOTB_par_nom
#!/bin/sh
nom=$(uname -n)
#est ce la bonne machine ?
if [ "$nom" != xxxxxxxx ] ; then
        echo " Vous devriez vous connecter sur XXXX !!! "
        exit
fi
#on donne ici les premiers caractères d'un nom de fichier (LOT) pour une recherche de type de ces fameux lots (il peut y en avoir des milliers car jusqu'à 10 jours de stockage)
echo " Donner ici les premiers caractères du nom du lot :\c"
read NOMLot   #  YYYYY dans mon exemple ci dessous
DAT=$(date |awk '{print $2" "$3}')  # pour limiter la recherche à ceux du jour courant (date systeme)

#listage des types de fichiers recherchés par ECC unique , chaque type de lot est différencié par les 1 ou2 ou 3 derniers caractéres (le fameux champ $3 du awk) des chiffres par exemple .83 ou.125 se situant en fin de nom du lot
ls -rtl /data/AUXB/iecc/data*/stockage/ |sed -e "/$DAT/!d; /$NOMLot*/!d" |awk -F "." "!x[$3]++ {print $0}"

Pour résumer, ce script me permet de lister des lots commencant par YYYY defini par $NOMLot puis d'affiner et limiter la recherche à un type se distinguant par des chiffres en fin de nom de fichiers comme un nom d'extension donc par exemple YYYY.ZZZZ.jjjjjj.152 et ceci que pour aujourd'hui.

En fait mon script fonctionnerait si la variable de {print $0} était bien interprété par awk or dans le script elle prend $0 soit la derniere valeur dans le tampon memoire.

Une précision sans doute utile : nos machines sont encore en UNIX AIX et vont bientot migrer en LINUX RedHat.

Hors ligne

#8 Le 10/03/2014, à 12:00

Rob414

Re : [RESOLU]AWK et script shell

Autant pour moi , et mes excuses pour Pingouinux.
Ta seconde formule fonctionne tres bien , j'avais oublié de "virer" la variable DAT  de ta première formule : DAT=$(date +"%b %e"), j'ai remis la mienne (DAT=$(date |awk '{print $2" "$3}'))et ça marche super !
Bien vu la simplification.
Merci beaucoup . Par contre je ne comprend pas pourquoi ton $0 est interprété et pas le mien ? je suis vexé!!!

Hors ligne

#9 Le 10/03/2014, à 12:12

pingouinux

Re : [RESOLU]AWK et script shell

Les deux façons  de calculer DAT donnent des résultats identiques chez moi, mais la seconde est plus simple.

$ date |awk '{print $2" "$3}'
Mar 10

$ date +"%b %e"
Mar 10

Par contre je ne comprend pas pourquoi ton $0 est interprété et pas le mien ?

awk -F "." "/$DAT/&&/$NOMLot/"'{if(!x[$3]++) {print $0}}'

Il faut des " " pour que $DAT et $NOMLot soient interprétés correctement, et des ' ' pour que $0 ne soit pas remplacé par le nom du programme.

Hors ligne

#10 Le 03/04/2014, à 15:12

Rob414

Re : [RESOLU]AWK et script shell

Mes excuses , je n'avais pas vu ta dernière réponse.
Je passe en résolu

Hors ligne