Grep sous solaris

Résolu/Fermé
jv_b Messages postés 4 Date d'inscription mardi 21 août 2007 Statut Membre Dernière intervention 27 septembre 2007 - 27 sept. 2007 à 11:01
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 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...

3 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
27 sept. 2007 à 13:13
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 à https://www.grymoire.com/Unix/Scripts/grep4.sh 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 : https://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
}'
0
jv_b Messages postés 4 Date d'inscription mardi 21 août 2007 Statut Membre Dernière intervention 27 septembre 2007
27 sept. 2007 à 14:39
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
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
27 sept. 2007 à 14:59
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.
0