Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
890 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [SHELL] Récupérer lignes précédentes du résultat d'une recherche

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SHELL] Récupérer lignes précédentes du résultat d'une recherche

n°1403356
Le Taz
Posté le 05-05-2017 à 14:34:31  profilanswer
 

Bonjour à tous,
 
Je cherche un moyen en shell me permettant de récupérer les lignes précédent le résultat d'une recherche d'un mot clé dans un fichier de log. Je m'explique.
J'ai un fichier de log qui ressemble à ça:
 

Code :
  1. ...
  2. ...
  3. ....
  4. 2017-05-05 09:52:42.112+01:00: fdsfdsfsd fsdf ATTENTION il y a un erreur, la voici
  5. 2017-05-05 09:52:43.112+01:00 fdslfjdsf lfjsdfjsldjf MESSAGE D'ERREUR SQL 1
  6. SELECT /* Nom projet */
  7. ...
  8. COMMIT;
  9. 2017-05-05 09:52:44.112+01:00: fdsfdsfsd fsdf FIN ERREUR <Nom projet>
  10. ...
  11. ....
  12. ....


 
Dans le cadre d'un traitement plus global, je dois fouiller cette log et remonter l'erreur à l'utilisateur, sachant que la variable Nom Projet a une valeur saisie par l'utilisateur avant lancement du dit traitement.
J'ai un ligne de commande qui me permet de récupérer tout le bloc entre le SELECT et FIN ERREUR:
 

Code :
  1. sed -n '/Nom projet/,/FIN ERREUR/p' fichier_log.log


 
Mon problème est de pouvoir récupérer en plus le VRAI message d'erreur qui se trouve sur les lignes précédente, tout en sachant que tout ça est noyé dans d'autres logs dans le même fichier, et que je veux garder le filtre de recherche sur le nom du projet pour être sûr de récupérer l'erreur du projet lancé par l'utilisateur et pas un autre.
 
Peut-être que le sed ne va pas dans ce cas, et qu'il faut passer par un awk, mais je n'arrive à rien pour le moment.
 
Des idées, svp ?
 
Merci.


---------------
Profil D3
mood
Publicité
Posté le 05-05-2017 à 14:34:31  profilanswer
 

n°1403359
Fork Bomb
Obsédé textuel
Posté le 05-05-2017 à 16:58:06  profilanswer
 

Tu devrais lire le manuel de grep, ça devrait t’aider.


---------------
Décentralisons Internet-Bépo-Troll Bingo - "Pour adoucir le mélange, pressez trois quartiers d’orange !"
n°1403360
Mysterieus​eX
Chieuse
Posté le 05-05-2017 à 18:39:54  profilanswer
 

Les gens de maintenant, le regex, ils maîtrisent plus :x

n°1403361
francoisp3​1
Posté le 05-05-2017 à 19:22:08  profilanswer
 

google sed n lines before patterns...

n°1403372
Le Taz
Posté le 06-05-2017 à 10:51:46  profilanswer
 

Fork Bomb a écrit :

Tu devrais lire le manuel de grep, ça devrait t’aider.


 
J'avais trouvé grep avec les options -A et -B mais je ne veux pas récupérer les n lignes après ou avant, mais toutes les lignes avant jusqu'à ce qu'un mot clé précis soit trouvé.
 

MysterieuseX a écrit :

Les gens de maintenant, le regex, ils maîtrisent plus :x


 
En clair ?
 

francoisp31 a écrit :

google sed n lines before patterns...


 
Je vais regarder de ce côté là aussi; je n'avais pas le mot clé pattern.
 


---------------
Profil D3
n°1403376
zipe31
Posté le 06-05-2017 à 11:44:21  profilanswer
 

Salut,
 
Tu veux uniquement la ligne contenant "Nom projet" et la ligne du dessus, ou tout le bloc (/Nom projet/,/FIN ERREUR/) + la ligne du dessus ?
 
Si 1er cas :
 

Code :
  1. grep -B1 ' Nom projet' fichier


ou

Code :
  1. sed -n 'h;n;/Nom projet/{G;p}' fichier


---------------
$ man woman
n°1403394
zipe31
Posté le 07-05-2017 à 09:35:07  profilanswer
 

Re-
 
Au cas où tu voudrais récupérer tout le bloc plus la ligne précédente, voici 2 solutions, une avec sed et une avec l’ancêtre de sed, le bien nommé ed.
 

Code :
  1. sed -n 'h;n;/Nom projet/{:z;/FIN ERREUR/!{N;bz};H;g;p}' fichier


 

Code :
  1. ed -s fichier <<<$'/Nom projet/-1,/FIN ERREUR/p'


 
 ;)


---------------
$ man woman
n°1403417
Le Taz
Posté le 07-05-2017 à 18:35:04  profilanswer
 

Top, merci.


---------------
Profil D3
n°1403491
Le Taz
Posté le 10-05-2017 à 09:26:47  profilanswer
 

@zipe31: peux-tu m'expliquer toutes ces options, stp ?
 
Je voudrais faire évoluer cette commande car j'ai un cas ou j'ai plusieurs fois des blocs d'erreur comme j'indiquais dans mon premier post, et ta commande ne me ramène que le premier.
 
Merci pour tes explications.


---------------
Profil D3
n°1403538
ttyb0
sysadmin, libriste, hacker
Posté le 11-05-2017 à 09:37:28  profilanswer
 

[:stayle_xercor]  

$ man sed


 :o

mood
Publicité
Posté le 11-05-2017 à 09:37:28  profilanswer
 

n°1403553
zipe31
Posté le 11-05-2017 à 17:30:10  profilanswer
 

Le Taz a écrit :

@zipe31: peux-tu m'expliquer toutes ces options, stp ?
 
Je voudrais faire évoluer cette commande car j'ai un cas ou j'ai plusieurs fois des blocs d'erreur comme j'indiquais dans mon premier post, et ta commande ne me ramène que le premier.
 
Merci pour tes explications.


 
Tiens, cette nouvelle syntaxe devrait faire ce que tu veux :

Code :
  1. sed -n '/ Nom projet/!{h;b};:z;/FIN ERREUR/!{N;bz};H;g;p' fich


 
Pour les explications :
 
 
-n
Affichage sur demande (marche avec l'option "p" (voir plus loin))
 
/ Nom projet/ ! {
Si la ligne contenue dans la mémoire principale de sed ne correspond pas au motif (le ! symbolise la négation) et le "{" débute un regroupement de commandes à appliquer  
             
   h
On place le contenu de la mémoire principale dans la mémoire secondaire de sed
                                 
    b
Puis on se branche à la fin du script (autrement dit, les autres commandes qui suivent ne s'appliquent pas à la ligne lue) et on recommence au début du script en chargeant une nouvelle ligne
                                   
}
Fin du regroupement de commandes
                                       
:z
On pose une étiquette nommée "z"
                                     
/FIN ERREUR/ !{    
Dans le cas où précédemment on avait rencontré le motif (Nom projet), ce regroupement de commandes s'applique.
Donc, si la mémoire principale ne contient pas le motif "FIN ERREUR"
                     
    N  
On  charge la ligne suivante dans la mémoire principale à la suite de la ligne précédente
                                 
    b z
Et on se branche (commande "b" ) à l'étiquette "z" et on recommence
                                 
}    
Fin du regroupement de commandes
         
Quand le motif "FIN ERREUR" est rencontré, on applique les commandes qui suivent  
                           
H
On place la mémoire principale à la suite du contenu (la ligne ayant le message d'erreur SQL) de la mémoire secondaire
                                       
g
On rapatrie le contenu de la mémoire secondaire dans la mémoire principale en écrasant tout ce qui s'y trouve  
                                       
p  
Et on imprime le tout sur la sortie standard (l'écran)

Message cité 1 fois
Message édité par zipe31 le 11-05-2017 à 17:30:46

---------------
$ man woman
n°1403567
Le Taz
Posté le 12-05-2017 à 11:17:31  profilanswer
 

ttyb0 a écrit :

[:stayle_xercor]  

$ man sed


 :o


 
Je comprends ton agacement, mais si je demande de l'aide ici, j'ai que j'ai passé un peu de temps à chercher, à comprendre, à essayer et à lire ce que je trouve à gauche et à droite, sans réussir totalement à arriver à mes fins.
 

zipe31 a écrit :


 
Tiens, cette nouvelle syntaxe devrait faire ce que tu veux :

Code :
  1. sed -n '/ Nom projet/!{h;b};:z;/FIN ERREUR/!{N;bz};H;g;p' fich




 
Top, merci beaucoup, c'est exactement ce que je voulais :jap:


---------------
Profil D3
n°1403572
Profil sup​primé
Posté le 12-05-2017 à 13:31:09  answer
 

alors il faut donner les éléments de réponses dont tu disposes, et les hypothèses que tu fais,
sinon on a l'impression de faire ton boulot : on te file le script, et les commentaires...
 
tu dois montrer que toi aussi tu bosses le sujet.

n°1403581
Le Taz
Posté le 12-05-2017 à 16:19:56  profilanswer
 

J'en prends note pour la prochaine fois même si j'avais évoqué quelques commandes testées avec sed (premier post) et grep (deuxième post)


Message édité par Le Taz le 12-05-2017 à 16:21:13

---------------
Profil D3

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [SHELL] Récupérer lignes précédentes du résultat d'une recherche

 

Sujets relatifs
Recherche d'un mot exactementrecherche mini-routeur OpenWRT
[Résolu] Barre de recherche Firefox inutilisable[Shell .sh] Copier des lignes dans un fichier
[SHELL] jointure entre 2 fichiers (Résolu)[Résolu] Bash : Récupérer la date de modification d'un fichier
[shell command] rediriger vers un fichier date_noméBTRFS - Comment recuperer une partion supprimé par erreur ?
Plus de sujets relatifs à : [SHELL] Récupérer lignes précédentes du résultat d'une recherche


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR