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

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Résolu][Bash] Recherche ligne par ligne dans un fichier .gz

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu][Bash] Recherche ligne par ligne dans un fichier .gz

n°2114168
NegroTruc
Posté le 01-12-2011 à 11:15:29  profilanswer
 

Bonjour,
 
Je cherche à faire une recherche dans un fichier de log compressé .gz.
J'utilise habituellement la commande "gunzip -c fichier.log.gz | grep ma_recherche".
Mais j'aurais besoin ici de faire un peu plus. Malheureusement, la machine n'est pas la mienne, et je suis très limité en commandes, options et droits...
 
En gros, j'aimerais pouvoir passer la commande "gunzip -c fichier.log.gz" dans un while.
 
Par exemple, pour mes logs non compréssés, je pensais faire :

Code :
  1. while read ligne
  2. do
  3.       if [grep machin]
  4.       then
  5.             ... [j'imbrique un autre if]
  6.       fi
  7. done < fichier.log


 
Or on ne peut passer qu'un fichier dans cette boucle et j'aimerais passer mon fichier.gz pour l'analyser ligne par ligne.
Y-a-t-il une possibilité ?
 
Merci de votre aide !   :)  
Bonne journée.


Message édité par NegroTruc le 01-12-2011 à 16:05:27
mood
Publicité
Posté le 01-12-2011 à 11:15:29  profilanswer
 

n°2114202
Profil sup​primé
Posté le 01-12-2011 à 12:11:00  answer
 

salut,
 

Code :
  1. while read line; do
  2. [...]
  3. done < <(zcat fichier.gz)

grep n'est pas indispensable pour une ligne, les doubles crochets peuvent faire le boulot, éventuellement expr aussi

n°2114236
NegroTruc
Posté le 01-12-2011 à 13:48:32  profilanswer
 

Merci de ta réponse.
Cela ne résout pas mon problème, car la machine n'en veut pas. Mais sinon, ça marche sur une plus récente. Si tu as une méthode pour contourner je suis preneur, sinon tant pis.
 
Par contre, je n'ai pas trop pigé par quoi tu voulais remplacer le grep. Pour un if je ferais :

Code :
  1. if [ `echo $ligne | grep recherche` ]
  2. then
  3.           ...
  4. fi

n°2114275
Mara's dad
Yes I can !
Posté le 01-12-2011 à 15:38:39  profilanswer
 

Code :
  1. zcat fichier.gz | while read line
  2. do
  3. [...]
  4. done


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°2114281
NegroTruc
Posté le 01-12-2011 à 15:55:05  profilanswer
 

Tout bêtement... Merci beaucoup ! :)

n°2114344
Sve@r
Posté le 01-12-2011 à 20:32:57  profilanswer
 

NegroTruc a écrit :

Pour un if je ferais :

Code :
  1. if [ `echo $ligne | grep recherche` ]
  2. then
  3.           ...
  4. fi



 
Salut
Pourquoi vouloir ABSOLUMENT écrire toujours if test ??? L'instruction if peut évaluer TOUTE commande pourvue que ladite commande renvoie un état 0/non 0 (ce qui est le cas de grep quand il trouve/ne trouve pas)
 

Code :
  1. if echo $ligne | grep recherche 1>/dev/null
  2. then
  3.           ...
  4. fi


Message édité par Sve@r le 01-12-2011 à 20:33:23
n°2114367
Profil sup​primé
Posté le 01-12-2011 à 22:24:07  answer
 

Code :
  1. zcat fichier | while read line; do
  2.    if [[ $line == *machin* ]]; then
  3.       echo "$line"
  4.    fi
  5. done

si le bash de la machine de destination est ancien, il peut ne pas accepter cette syntaxe non plus.

n°2114411
NegroTruc
Posté le 02-12-2011 à 10:28:44  profilanswer
 

@watael : Ma machine prend le pipe/while, donc cela résout bien mon problème. :)
Et le test de ton if me paraît le plus simple. Je n'y avais pas pensé.
 
@Sve@r : Je ne vois pas trop la différence entre nos deux if. Je ne fais pas de tests, je joue sur le code retour également non ?
 
Merci à vous.

n°2114693
Sve@r
Posté le 03-12-2011 à 21:26:23  profilanswer
 

NegroTruc a écrit :

@Sve@r : Je ne vois pas trop la différence entre nos deux if. Je ne fais pas de tests, je joue sur le code retour également non ?


Dans l'absolu oui. Car que tu écrives

Code :
  1. if test
  2. then ...


ou

Code :
  1. if grep
  2. then ...


dans les deux cas tu demandes à "if" d'évaluer le code retour de la commande en question.
 
Toutefois, ton écriture  

Code :
  1. if test `echo $ligne | grep recherche`
  2. then
  3.          ...


l'imbrication de backquottes demande au shell un travail supplémentaire, à savoir ouvrir un nouveau processus qui ira exécuter echo $ligne | grep recherche puis récupérer le texte affiché par cette commande et ensuite ramener ce texte dans l'instruction puis ensuite le processus se terminera et le test reprendra la main pour aller tester ce texte (sous-entendu "tester s'il existe ou pas" donc tester si grep a ramené quelque chose ou pas).
Donc oui ça marche... mais que de travail alors qu'un simple if grep eut suffit...
 
Je ne râle pas pour le if test qui est aussi efficace que if autre_chose, je râle parce que, par manque d'ouverture d'esprit en ne réalisant pas que l'instruction if peut évaluer toute commande quelle qu'elle soit, la majorité des programmeurs shells se cantonnent dans des "if test" et vont ensuite chercher des trucs abracadabrants pour que ça y rentre...
 
PS: "[]" est équivalent à "test" et tout ce que j'ai dit à propos du if est valable aussi pour le while et le until. D'ailleurs l'instruction de watael "while read ..." illustre bien cette notion (tant que read renvoie "vrai" donc tant que read a lu quelque chose)...
 

NegroTruc a écrit :

@watael : Ma machine prend le pipe/while, donc cela résout bien mon problème


watael ne parlait pas du pipe while (qui est un des fondamentaux d'Unix)... mais de la syntaxe [[ ... ]] qui est une syntaxe connue que des shells un peu évolués (à partir de bash)  :D


Message édité par Sve@r le 03-12-2011 à 21:39:13
n°2114838
NegroTruc
Posté le 05-12-2011 à 11:29:40  profilanswer
 

Pour le pipe while, c'était l'objet de ma question. Malgré que le principe soit fondamental, je ne l'avais jamais encore utilisé avec une boucle. J'avais crû tester cette syntaxe sans succès. Mais j'avais dû me planter quelque part. En le voyant m'être proposé ici, j'ai retenté et cela a fonctionné. Mon problème d'origine est donc bien résolu.  
 
Quant à la boucle if, effectivement, je ne savais pas que cela demandait moins de travail sans les backquotes. A l'avenir, je ne les utiliserais plus de cette façon.
 
Je n'utilise que très peu les scripts en shell et depuis peu de temps. Je fais ce que je peux avec les connaissances que j'ai. Je pose parfois des questions connes qui me permettent de l'être un peu moins. Tu m'en vois désolé si je manque d'ouverture d'esprit... :/
 
Merci pour les infos en tout cas.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Résolu][Bash] Recherche ligne par ligne dans un fichier .gz

 

Sujets relatifs
Comment supprimer une boite de dialogue à l'ouverture d'un fichier?[DELPHI] Lire les détails d'un fichier ?
Recherche de chaîne.[XUL/js] variables en global dans un fichier annexe
Traduire un fichier HTML volumineux ...Log : récupérer le numéro de la ligne d’exécution.
envoyer des fichier en vbs[C++] Utiliser un fichier texte comme ressource
Filtrage fichier XML via DomBash aide projet
Plus de sujets relatifs à : [Résolu][Bash] Recherche ligne par ligne dans un fichier .gz


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