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

Recherche ligne par ligne dans un fichier .gz [Résolu][Bash] - Shell/Batch - Programmation

Marsh Posté le 01-12-2011 à 11:15:29    

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
Reply

Marsh Posté le 01-12-2011 à 11:15:29   

Reply

Marsh Posté le 01-12-2011 à 12:11:00    

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

Reply

Marsh Posté le 01-12-2011 à 13:48:32    

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

Reply

Marsh Posté le 01-12-2011 à 15:38:39    

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


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 01-12-2011 à 15:55:05    

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

Reply

Marsh Posté le 01-12-2011 à 20:32:57    

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
Reply

Marsh Posté le 01-12-2011 à 22:24:07    

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.

Reply

Marsh Posté le 02-12-2011 à 10:28:44    

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

Reply

Marsh Posté le 03-12-2011 à 21:26:23    

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
Reply

Marsh Posté le 05-12-2011 à 11:29:40    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed