Posez votre question Signaler

Grep sous solaris [Résolu]

jv_b 4Messages postés 21 août 2007Date d'inscription - Dernière réponse le 27 sept. 2007 à 14:59
Bonjour à tous,
Je travaille sous solaris et ai besoin d'une petite commande (peut être en perl).
Voici donc ma problèmatique :
Je cherche à récupérer dans un fichier de log volumineux certains passages :
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
En "greppant" mon fichier avec "=============== ERROR ", je récupère bien les lignes qui m'interesse, mais je voudrais récupérer également les 3 lignes précédentes ainsi que les 5 lignes suivantes.
Il semble que la commande grep ait une option (-B) sur certains OS, mais pas sur solaris.
Merci d'avance pour vos contributions...
Lire la suite 

Grep sous solaris »

3 réponses
Réponse
+0
moins plus
Salut,

Il semblerait que sous Solaris la commande "grep" ait une option "-b" (voir man grep).
En attendant voici un petit script faisant appel à "sed", modifié par rapport à http://www.grymoire.com/Unix/Scripts/grep4.shl'original qui devrait faire l'affaire. Peut être faudra-t-il y apporter des ajustements, notamment au niveau du dernier échange entre les mémoires tampons, en fonction des fichiers "parsés" et du résultat en sortie qui risque de ne pas être parfait, n'ayant pas tous les paramètres sous la main pour tester au mieux...
#!/bin/sh

# Émulation de grep -A3 -B5 "motif" fichier
# Largement inspiré du script grep4.sh
# sur le site : http://www.grymoire.com/Unix/Sed.html#uh-56

case $# in
        1);;
        *) echo "Usage: $0 \motif\" < fichier";exit;;
esac;

sed -n '
'/$1/' !{
        # Motif non satisfait - ajouter la ligne dans la mémoire annexe
        H
        # Remettez-le dans la mémoire principale (espace de travail)
        x
        # Ne conserver que 3 lignes dans le tampon
        # 2 lignes correspondent à .*\n.*
        # 3 lignes à  .*\n.*\n.*
        # On efface les lignes exédentaires
        s/^.*\n\(.*\n.*\n.*\)$/\1/
        # Mettre les 3 lignes (au plus) dans la mémoire annexe à nouveau
        x
}
'/$1/' {
        # Le motif est satisfait - Ajouter le contenu de la mémoire principale
        # à la mémoire secondaire
        H
        # Prendre la ligne suivante (n) et ajouter les 4 autres (N) 
        n;N;N;N;N
        # Ajouter le tout à la mémoire annexe
        H
        # Échanger le tout avec la mémoire principale
        x
        # Afficher les lignes
        p
}'
Ajouter un commentaire
Réponse
+0
moins plus
MERKI...

ça marche nickel :

le petit condensé sans les explications car je désire également utiliser la commande online.

sed -n ''/ERROR/' !{H;x;s/^.*\n\(.*\n.*\)$/\1/;x;}
'/ERROR/' {H;n;N;N;N;N;N;N;H;x;p;}' rman****.log

En revanche, si quelqu'un sait comment faire pour ne pas être obligé de garder le passage à la ligne ...

sed -n ''/ERROR/' !{H;x;s/^.*\n\(.*\n.*\)$/\1/;x;} '/ERROR/' {H;n;N;N;N;N;N;N;H;x;p;}' rman****.log

Quand je teste cette commande, je reste bloqué (enfin, le process... pas moi).

Bon déjà, c'est nickel. Je ne suis plus obligé de me palucher les 300 000 lignes pour trouver mes erreurs.


Merci beaucoup jipicy
Ajouter un commentaire
Réponse
+0
moins plus
Les quotes ne sont plus nécessaires autour du motif (elles n'étaient là que par rapport à la variable "$1"). J'ai juste rajouté un ";" entre les 2 expressions, après la 1ère accolade fermante :
sed -n '/ERROR/! {H;x;s/^.*\n\(.*\n.*\)$/\1/;x;}; /ERROR/ {H;n;N;N;N;N;N;N;H;x;p}' rman****.log
;-))

Édit : Il faut aussi supprimer le dernier ";" après l'instruction "p" avant la dernière accolade fermante.
Ajouter un commentaire
Ce document intitulé « grep sous solaris » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook