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 29/05/2015, à 15:27

abou33

Afficher un intervalle entre 2 motifs une seule fois

Bonjour,

J'ai un p'tit soucis de script...
Voilà, je un fichier contenant une structure de ce style :

--------------------------------------------------------------------------------
| Etat du 29/05/2015 15:14:04                                                  |
|                                                                              |
| Recherche de chaines                                                         |
|                                                                              |
|       Modele :        TIERSI      010                                        |
|                                                                              |
|       Classe :        Toutes                                                 |
|                                                                              |
|       Parametre :     Tous                                                   |
--------------------------------------------------------------------------------


--------------------------------------------------------------------------------
| Modele       | Version   | Chaine   | Nom      | Classe                      |
--------------------------------------------------------------------------------
|TIERSI        |010        |ACDNTI    |ACDNTI    |CRISTAL-MAJ                  |
|    P_CODORG      Code organisme                                              |
|    P_CODENV      Code environnement                                          |
--------------------------------------------------------------------------------
|TIERSI        |010        |BICNTI    |BICNTI    |CRISTAL-MAJ                  |
|    P_CODORG      Code organisme                                              |
|    P_CODENV      Code environnement                                          |
--------------------------------------------------------------------------------
...

Je cherche les lignes pour une chaîne donnée (par exemple ACDNTI) et donc trouver :

|    P_CODORG      Code organisme                                              |
|    P_CODENV      Code environnement                                          |

Pour cela je joue avec les expressions régulières mais je n'arrive pas.

Je suis bloqué ici :

  egrep -E "^\|$mod *\|$ver *\|$cha" -A 15 < /tmp/ab.txt
|TIERSI        |010        |ACDNTI    |ACDNTI    |CRISTAL-MAJ                  |
|    P_CODORG      Code organisme                                              |
|    P_CODENV      Code environnement                                          |
--------------------------------------------------------------------------------
|TIERSI        |010        |BICNTI    |BICNTI    |CRISTAL-MAJ                  |
|    P_CODORG      Code organisme                                              |
|    P_CODENV      Code environnement                                          |
--------------------------------------------------------------------------------
|TIERSI        |010        |CCDNTI    |CCDNTI    |CRISTAL-MAJ                  |
|    P_CODORG      Code organisme                                              |
|    P_CODENV      Code environnement                                          |
|    P_FICHIER     Nom du fichier en entree (sans chemin)                      |
--------------------------------------------------------------------------------
|TIERSI        |010        |CLONTO    |CLONTO    |CRISTAL-MAJ                  |
|    P_CODORG      Code organisme                                              |
|    P_CODENV      Code environnement                                          |

Je n'arrive à ne garder que les 2 lignes qui m'interessent ....

J'ai bien essayé de rajout du "sed" mais je sais pas comment lui dire "qu'une fois"

egrep -E "^\|$mod *\|$ver *\|$cha" -A 30 < /tmp/ab.txt | sed -n "/$mod/,/$mod/{//d;p}"
|    P_CODORG      Code organisme                                              |
|    P_CODENV      Code environnement                                          |
--------------------------------------------------------------------------------
|    P_CODORG      Code organisme                                              |
|    P_CODENV      Code environnement                                          |
|    P_FICHIER     Nom du fichier en entree (sans chemin)                      |
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
|    P_CODORG      Code organisme                                              |
|    P_CODENV      Code environnement                                          |
--------------------------------------------------------------------------------

Avez-vous une piste ?

Hors ligne

#2 Le 29/05/2015, à 16:17

pingouinux

Re : Afficher un intervalle entre 2 motifs une seule fois

Bonjour,
Essaye ceci (si j'ai bien compris)

egrep -E "^\|$mod *\|$ver *\|$cha" -A 2  < /tmp/ab.txt | tail -n +2

Ajouté : Autre solution

awk "/^\|$mod *\|$ver *\|$cha/ {getline;print;getline;print;exit}" /tmp/ab.txt

Édité :
Et si tu ne veux pas te limiter aux 2 lignes qui suivent la chaîne recherchée

sed -n "/^|$mod *|$ver *|$cha/!b;{:a;n;/^---/!{p;ba}}" /tmp/ab.txt

ou

awk "/^\|$mod *\|$ver *\|$cha/ {deja=1;getline}/^---/{if(deja)exit}{if(deja)s=s\$0\"\n\"}END{print s}" /tmp/ab.txt

Dernière modification par pingouinux (Le 30/05/2015, à 06:32)

Hors ligne