Forum Programmation.shell unzip |grep

Posté par  .
Étiquettes : aucune
0
24
juin
2005
Bonjour,
je tourne un peu en rond depuis quelque temps :

je tente de lire dans un fichier sxw pour trouver les fichiers qui comprennent le mot cahier (par exemple).

j'ai donc trouvé avec la ligne de commande un :

unzip -p fichier.sxw content.xml|grep -i "cahier" et
là, il m'affiche automatiquement
le contenu xml du fichier content.xml qui a bien cahier dedans.
Hors j'aimerais avoir le nom du fichier et pas le contenu de la ligne , j'ai donc essayé avec grep -l et là, il affiche (entrée standard).

je comprend le problème : le fichier est bien l'entré standard suis-je bête.


Donc, j'essaye de faire une script shell (vous moquez pas ! )

#!/bin/bash

for i in *.sxw
do
if [unzip -p $i content.xml|grep -i -l "scaner"]; then
echo $i
fi
done

Et là, il n'affiche rien, pourtant il devrait écrire le nom du fichier,
si je rajoute une ligne :
unzip -p $i content.xml|grep -i -l "scaner", il affiche rien non plus.

Quelqu'un pour aider un pov' handicapé de la comprenette des shell et sous-shell (et des tests)

Merçi
hervé
  • # zgrep

    Posté par  . Évalué à 2.

    je pense que ca doit pouvoir te simplifier la vie ...


    Dam
    • [^] # Re: zgrep

      Posté par  . Évalué à 1.

      Probablement !
      ?

      j'suis pas le seul handicapé ici, cela rassure

      (j'rigole :-)) )
      • [^] # Re: zgrep

        Posté par  . Évalué à 2.

        euh... j 'viens de voir, la réponse est dans le titre.

        z'avais bien dit qu'j'étais handicapé.

        j'va regarder.
  • # scaner ?

    Posté par  (site web personnel) . Évalué à 2.

    Tu es sur d'avoir "scaner" orthographié comme ça dans un fichier ?
    Et sinon comme dit ci-dessus, zgrep c'est plus cool :)
    • [^] # Re: scaner ?

      Posté par  . Évalué à 2.

      Oui, il est orthographie comme cela.

      #!/bin/bash

      for i in `ls -R *.sxw`
      do
      echo $i
      zgrep -i -l "scaner" $i
      done


      Maintenant 2 problèmes : si j'ai un nom avec un espace dans le fichier, j'ai une erreur gzip : part.gz: no such file or directories, (il faudrait protéger le nom des fichiers par \, mais comment faire ?

      2 : dans ce cas le ls -R *.sxw n'est pas récursif alors que les -R l'est (récursif)
      • [^] # Re: scaner ?

        Posté par  (site web personnel) . Évalué à 2.

        1/ met "$i" au lieu de $i

        2/ ls -R *.sxw te liste tout le contenu des repertoires dont le nom se termine par .sxw, utilise plutôt find -name '*.sxw'
  • # plutôt comme ça :

    Posté par  . Évalué à 3.

    for i in *.sxw ; do
       unzip -p "$i" content.xml | grep -l --label="$i" "scaner"
    done
    ou bien éventuellement comme ça, mais c'est plus long :
    for i in *.sxw ; do
       if unzip -p "$i" content.xml | grep -q "scaner" ; then
          echo "$i"
       fi
    done
  • # ls -R ?

    Posté par  . Évalué à 2.

    juste une dernière :
    ls *.sxw -> marche bien

    ls -R -> marche bien

    ls -R *.sxw -> marche pas bien (pas récursif)
  • # trouver un mot dans un fichier sxw sous linux

    Posté par  . Évalué à 4.

    Je place ici la réponse toute faite, ce qui fera probablement gagner du temps à quelqu'un d'autre une autre fois.:

    #!/bin/bash
    for i in `find -name "*.sxw"` ; do
    unzip -pqq "$i" content.xml 2>\dev\null | grep -l -i --label="$i" "$1" 2>\dev\null
    done

    vous enregistrez ce fichier sous un nom recherche.sh
    (le mien est à la racine de mon home)
    puis chmod +x recherche.sh
    puis recherche.sh mot_a_cherche -> cela liste le nom des fichiers sxw qui contiennent le mot mot_a_chercher

    Astuce : vous faite un lien symbolique
    ln -s /ou/est/votre/fichier/recherche.sh /usr/bin/recherche_sxw
    (ou /usr/local/bin selon votre choix -il faut être root)

    et maintenant lorsque vous tapez :
    recherche_sxw mot_a_chercher à partir d'un répertoire, il recherche dans le répertoire courant et tous les sous répertoires.


    voila
    • [^] # Re: trouver un mot dans un fichier sxw sous linux

      Posté par  (site web personnel) . Évalué à 1.

      Tu devrais peut être le proposer dans les astuces...
    • [^] # Re: trouver un mot dans un fichier sxw sous linux

      Posté par  (site web personnel) . Évalué à 2.

      #!/bin/bash
      for i in `find -name "*.sxw"` ; do
      unzip -pqq "$i" content.xml 2>\dev\null | grep -l -i --label="$i" "$1" 2>\dev\null
      done


      Euh.... je prefererais la syntaxe suivante:

      #!/bin/bash
      #ce script recherche la chaine fournie en argument dans l'ensemble des fichiers sxw a partir du repertoire courant.

      file_list=$(find -name "*.sxw")
      chaine=$1

      for i in "${file_list}"
      do
      unzip -pqq "$i" content.xml 2>\dev\null | grep -l -i --label="$i" "${chaine}" 2>\dev\null
      done


      C'est un peu plus propre, c'est un peu plus flexible, et surtout ca donne de bonne habitudes pour quand on se met a faire des scripts de tueur longs de plusieurs pages (si si, ca existe ! J'avais fait un system de creation automatique de jeux de courbes pre-definis pour des manips. Il me suffisait a la fin de la manip de taper "cr_graph.sh" pour que les scripts aillent chercher les bonnes données dans une base de donnée (qui avait enregistree les mesures de plus de 100 capteurs), chargent les donnees dans Xmgrace, mettent les bonnes couleurs, les bons titres, les bonnes legendes, ... et creer un fichier PDF de cela).

      Mathias

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.