Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

question sur awk


linux72
 Share

Messages recommandés

je cherche a faire un tri sur un fichier de log.

je recherche un seul type d'incident.

le souci est que j'arrive bien a macther l'expression que je veux, mais je voudrai aussi la ligne precedent qui m'indique l'heure et la date.

 

Mon fichier erreur.log est du type:

"fddsqfdsqfjsdùkmfj

dfdsfdsfdfdfqsff

15 mars 2003 14h14

erreur 123

fgfdsgh

ghhghghhgfhd

gbjgbkmgjbmjkjhjrapg

30 mars 2003 10h23

erreur 123"

 

 

Ma ligne de commande est:

awk ' /erreur 123/ {print $0} ' erreur.log

 

je sais qu'il existe la variable NR est indique le nombre d'enregistrement lu, mais je ne sais pas si on peut lui indique de sortir la ligne numero NR-1.

 

si je fais :

awk ' /erreur 123/ {print NR-1,$0}', cela me sort le numero de la ligne avant l'enregistrement courant, mais je veux la ligne qui correspond a ce numero.

Lien vers le commentaire
Partager sur d’autres sites

Tu traites le fichier ligne à ligne, tu ne peux pas afficher la ligne précédente lors du traitement d'une ligne.

Le mieux est de stocker dans une variable chaque ligne (à la fin du script awk) histoire de pouvoir la ressortir lorsque la ligne courante correspond à /^erreur 123/ ...

awk '/^erreur 123/ {print MOINSUN, $0 } /^/ { MOINSUN = $0 }' erreur.log

Fonctionne avec gawk...

Pas mieux...

Lien vers le commentaire
Partager sur d’autres sites

j'ai trouvé une solution, barbare, mais qui marche, en utilisant les commande head et tail et la variable NR de awk qui me donne le numero de la ligne traité:

 

for i in `awk /erreur 123/ {print NR}` erreur.log
do head -$i erreur.log | tail -2                                # Je recupre les NR premiere lignes du fichier et ne sort que les 2 dernieres
done

Lien vers le commentaire
Partager sur d’autres sites

juste pour info, j'ai reussi, un petit peu plus a optimiser mon traitement, en evitant la boucle for avec la commande system de awk

 

  FIC=erreur.log
awk -vfic=$FIC '/erreur 123/ {system("head -"NR" "fic"|tail -2")}' $FIC 

Lien vers le commentaire
Partager sur d’autres sites

La commande awk sous les system unix ou linux, permet de faire des traitements sur des fichiers, en ressortir les information que tu veux, ou faire de la mise en forme.

 

il traite ligne par ligne le contenu du fichier et y applique les fonctions que tu as defini dans ton awk, a travers un language, qui me semble ressemble au C ( instruction printf, close de fichier ex ....)

Lien vers le commentaire
Partager sur d’autres sites

tangui : c'est un langage interprété, à base d'expressions "régulières" (oui, c'est une mauvaise traduction de "regular expressions"), le reste c'est de la syntaxe façon script... et comme pas mal d'outils en ligne de commande, ça te permet de manipuler des fichiers comme bon te semble...

 

linux72 : ta solution est hyper-bourrine, rouvrir le fichier à chaque ligne rencontrée pour récupérer la précédente... elle te plaisait pas ma solution ???

Lien vers le commentaire
Partager sur d’autres sites

si je comprend bien, le

/^/

veut dire que tu ne prend pas en compte la condition

erreur 123

, et que tu met chaque ligne dans la variable MOINSUN ?????????????????

Lien vers le commentaire
Partager sur d’autres sites

^ en regexp c'est le début de ligne (juste pour qu'il évite de tout parser si ton code erreur est bel et bien signalé en début de ligne)... dans le même registre, le $ indique la fin de ligne...

Le ^ est utilisé en négation dans les ranges de caractères : [^u] <---- pas "u"

Pour en revenir à mon code, oui, chaque ligne est mise en mémoire dans la variable "MOINSUN" et est ressortie au moment opportun... si ça t'embête, tu peux faire un vrai filtre pour ne mémoriser que les lignes contenant une date, mais je te laisse chercher quoi mettre entre les deux / ;-)

Lien vers le commentaire
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

 Share

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...