URL: https://linuxfr.org/forums/linux-debutant/posts/comportement-grep-different-dans-le-shell-et-dans-un-script Title: Comportement GREP différent dans le shell et dans un script Authors: ArbreCiré Date: 2014年03月03日T15:12:40+01:00 License: CC By-SA Tags: Score: 0 Bonjour, Je suis très novice dans le monde linux. Je cherche à remplacer une chaine de caractères dans plusieurs fichiers texte (+de 5000) Ces fichiers sont générés par des machines de test, ils comportent 1 seule ligne. La chaine à chercher est présente dans plusieurs fichiers ( 1 fichier par erreur rencontrée ) la chaine de remplacement est dans un fichier de type Liste.csv ```sh Chaine1;Remplace1 Chaine2;Remplace2 Chaine3;Remplace3 Chaine4;Remplace4 Chaine5;Remplace5 ... Chainex;Remplacex ``` Sous Shell, si je lance le grep plusieurs fois de suite j'ai le retour de la ligne voulue à chaque fois que je lance grep -n ^Chaine1 Liste.csv Dans un script AWK la même commande donne un résultat différent. je récupère le résultat du grep dans une variable awk `grep -n ^Chaine1 Liste.csv | getline VariableAwk` Et la problème ... Seule la 1ère recherche donne un résultat. si chaine1 est cherché une 2ème, 3ème fois, la variable reste vide. Il semble que le grep ne lise qu'une fois le fichier Liste.csv la 1ere fois il trouve la chaine en ligne 2, la fois suivante, la recherche commence à la ligne 3 et donc ne trouve pas de correspondance. Pouvez vous m'aider à résoudre ce problème merci EDIT =========== La syntaxe du script peut paraitre bizarre, mais pauvre de moi, je suis sous MS-DOS avec les commandes GnuWin32. les " et les ' n'ont pas tout à fait la même signification qu'avec un vrai shell. c'est la raison des trop nombreux "print commande" du script. J'ai tester avec la commande SED à la place GREP, le problème est le même, seule la 1ère recherche est fructueuse, les autres retournent des variable vides. La commande lancée est ```sh awk -f Script_Article_From_Liste.awk *.txt ``` Le script est (plein de "print" pour suivre à l'écran, ils seront supprimés) ```sh BEGIN { FS=";"; OFS=";"; DATAFILE="Liste_Of-Article-Qty.csv" SNKEY="M" SNCNTR=100000 print "----- START AWK -----------------------------------------------------" print "liste OF - Article : " DATAFILE } { # Lecture 1er fichier print "" print "---------------------------------------------------------------------" print "Fichier : " FILENAME " || " 0ドル OFNUM=1ドル PARTNUM=2ドル SERNUM=8ドル # Chercher dans le fichier DATAFILE la chaine OFNUM avec Grep # !!! Ne fonctionne pas si 2 fois le meme OF cherche ... GREPCMD="GREP -n ^" OFNUM " " DATAFILE print "COMMANDE : " GREPCMD GREPCMD | getline DATALINE print "GREP DATALINE : " DATALINE # Chercher dans le fichier DATAFILE la chaine OFNUM avec SED # !!! Ne fonctionne pas si 2 fois le meme OF cherche ... # le head pour ne garder que la premiere occurence trouvee # SEDCMD="SED -s -n /" OFNUM "/p;q " DATAFILE | head -n 1" # print "COMMANDE : " SEDCMD # SEDCMD | getline DATALINE # print "DATALINE : " DATALINE # AJOUTER conditions d'erreurs !! # DATALINE vide ... # # Reformater les separateurs ( grep utilise : au lieu de ; ) # Pas utile si SED utilis‚ ... la place de GREP sub(":",";",DATALINE) # Changer DATALINE en tableau pour extraire les champs LINE / OF / NEWART / QTY split(DATALINE,DATATAB) print "DATATAB : " "(1) " DATATAB[1] " | (2) " DATATAB[2] " | (3) " DATATAB[3] " | (4) " DATATAB[4] # Creer Numero de serie / Remplacer Code article SNCNTR=(SNCNTR + 1) 8ドル=SNKEY SNCNTR "-" 2ドル 2ドル=DATATAB[2] PARTNUM=2ドル SERNUM=8ドル # Ligne Modifiee print "Fichier : " FILENAME " || " 0ドル # Ecrire le fichier sur le disque # print 0ドル> FILENAME # Fermer les variables Locales ... DATALINE="" DATANUMLINE="" OFNUM="VIDE" PARTNUM="VIDE" SERNUM="VIDE" delete DATATAB # Vider le tableau pour eviter les effets de bords close(DATAFILE) # Fermer le fichier pour forcer la lecture depuis le début (ne marche pas!) } END{ print "" print "----- FIN AWK ---------------------------------------------" print "Fichier(s) lu(s) : " SNCNTR-100000 print "Dernier Numero de serie : " SNKEY SNCNTR print "" } ``` La liste de correspondance est (raccourcie) ```sh No_OF;Article;Qté 1000014645;R8011450;250 5000000882;R7900085;247 1000014433;R800019;140 2000050803;R800020;136 5000000843;R800021;130 ``` Les fichiers à traiter sont AwkTest_01.txt ```sh 5000000882;000176A;sg;130927;105057;AOI_2;0.0.2;1;1;0;; ``` AwkTest_01b.txt (celui qui n'est pas vu ... ) ```sh 5000000882;000176B;sg;130927;105057;AOI_2;0.0.2;M100002-7654321;1;0;; ``` AwkTest_02.txt ```sh 2000050803;000177A;sg;130927;105135;AOI_2;0.0.2;1;1;0;; ```