Rechercher : dans
Par :

Grep sous solaris

Dernière réponse le 27 sep 2007 à 14:59:42 jv_b, le 27 sep 2007 à 11:01:02 
 Signaler ce message aux modérateurs

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...

Configuration: Sun solaris

Meilleures réponses pour « grep sous solaris » dans :
[Commande] “grep” récursif Voir Lorsque l'option -r (ou -d recurse) de la commande grep n'est pas disponible, comme sous HP-UX, il faut l'utiliser conjointement avec la commande find. Par exemple, pour chercher récursivement la chaîne «CCM» dans tous les fichiers réguliers à...
[Unix] Solaris et Open-Solaris Voir Solaris (société Sun) a initialement été basé sur 4.1BSD mais a ensuite été basé sur UNIX System V Release 4 (Solaris 2 - SunOS 5). Solaris et Open-Solaris ne sont donc plus de la famille BSD. Pour plus de compléments sur la génèse, voir...

1

jipicy, le 27 sep 2007 à 13:13:38

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
}'
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

jv_b, le 27 sep 2007 à 14:39:19

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

Répondre à jv_b

3

 jipicy, le 27 sep 2007 à 14:59:42

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. Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy