Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/08/2011, à 09:28

thomine

[Résolu] Extraire un motif de fichiers répondant à un critère donné

Bonjour,

Avis aux spécialistes du script et de la recherche. Voici mon problème :

J'ai environ 50 000 fichiers HTML. Dans le header de ces fichiers, j'ai leur ID. Je souhaite récupérer l'ID de tous les fichiers qui contiennent une chaîne de caractères donnée.

L'objectif est que je puisse récupérer la liste de tous les ID (123456 dans l'exemple) quand le fichier contient CHAINE_A_TROUVER.

Voici un exemple (désolé pour le formattage, je n'arrive pas à poster un message avec des balises <>) :

--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"--
--meta name="ID" content="123456"--
...
--head--
--body--
...
blabla
CHAINE_A_TROUVER
blabla
...

Au début je pensais faire ça en 2 temps :
1. Récupérer la liste de tous les fichiers qui contiennent la chaîne CHAINE_A_TROUVER. J'ai réussi à obtenir cette liste.
2. Extraire l'ID de tous les fichiers de la liste précédente. Là je commence à bloquer...
Finalement je me dis qu'on doit pouvoir tout faire d'un coup à l'aide de find, grep ou sed...

Je suis donc ouvert à 2 solutions :
- Celle qui me permettra d'extraire un motif des fichiers qui contiennent une chaîne donnée.
- Celle qui me permettra d'extraire un motif d'une liste de fichiers donnée.

Avis aux amateurs ! Merci pour votre aide !

Dernière modification par thomine (Le 18/08/2011, à 14:39)

Hors ligne

#2 Le 18/08/2011, à 09:37

survietamine

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

salut, les fichiers sont-ils tous dans le même répertoire ?
Ou bien, ils sont éparpillés dans plein de sous-répertoires ?


Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?

Hors ligne

#3 Le 18/08/2011, à 09:49

thomine

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

Bonjour survietamine,
Ils sont éparpillés dans plusieurs répertoires, j'ai une arborescence sur 4 - 5 niveaux.
Merci pour ton aide.

Hors ligne

#4 Le 18/08/2011, à 10:21

survietamine

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

si :
- t'as déjà la liste dans un fichier
- de type texte brut
- qu'il y a 1 entrée sur chaque ligne
- et que le chemin complet vers le fichier est renseigné

tu peux faire quelque chose comme ça :

while read fichier ; do grep 'name="ID" content="' $fichier | sed -r 's/(^.*content=")([0-9]*)(".*)/\2/g' ; done < $ton_fichier_contenant_ta_liste

ça répond à ta requête numéro 2.

Dernière modification par survietamine (Le 18/08/2011, à 10:21)


Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?

Hors ligne

#5 Le 18/08/2011, à 13:10

thomine

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

Merci survietamine pour ton aide. Je suis en train de retravailler ta commande car l'expression régulière dans sed ne fonctionne pas. En fait je n'ai pas été assez précis dans ma demande car dans mon fichier HTML, j'ai plusieurs

meta name="xxx" content="yyy"

sur la même ligne. Autre point, mon ID n'est pas un nombre mais une chaîne de caractères. Il faut donc que j'extrais ce qu'il y a entre les 2 guillemets.
J'ai donc corrigé en :

sed -r 's/(^.*name="ID" content=")(.*)/\2/g'

C'est pas mal mais je ne sais pas comment supprimer tout ce qui se trouve après le guillemet de fin de content. Je regarde comment transformer mon (.*) en tout sauf un guillemet (car mon id contient du texte mais peut-être aussi des caractères spéciaux comme des accents...).

Dernière modification par thomine (Le 18/08/2011, à 13:25)

Hors ligne

#6 Le 18/08/2011, à 14:00

survietamine

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

oui, tu adaptes selon tes besoins.
Pour les tests, tu peux faire juste un echo de ta chaîne et envoyer via le tuyau vers sed jusqu'à ce que ça te convienne.
C'est pratique sed avec les regexp.
Si tu n'es pas à l'aise avec sed et selon le contenu de la ligne, c'est peut-être plus simple avec awk.
Ou carrément avec un tableur, j'ai vu des collègues développeurs faire ces tâches dans Excel à coups de "REPLACE"

Dernière modification par survietamine (Le 18/08/2011, à 14:00)


Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?

Hors ligne

#7 Le 18/08/2011, à 14:38

thomine

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

Merci beaucoup survietamine pour ton aide. Effectivement ça m'arrive d'utiliser Excel pour manipuler des données.
J'ai trouvé une expression régulière qui me convient, la voici :

while read fichier ; do grep 'name="ID" content="' $fichier | sed -r 's/(^.*name="ID" content=")([^"]*)(.*)/\2/g' ; done < $ton_fichier_contenant_ta_liste

Dans sed, le groupe 1 contient tout ce qu'il y a avant l'ID, le groupe 2 contient l'ID, et le groupe 3 ce qu'il y a après l'ID. La difficulté étant de déterminer la fin de l'ID. Pour cela, j'accepte tous les caractères sauf le guillemet, ce qui permet de trouver la fin de l'ID.
Encore merci pour ton aide, ça m'a permis d'avancer plus vite et de me plonger dans la doc de sed !
Pour info, voici un bon site sur les expressions régulières : http://regexadvice.com/.
J'ai eu une expression régulière complexe à faire et j'ai eu la réponse dans la journée avec une explication détaillée.

Hors ligne

#8 Le 18/08/2011, à 21:04

AnsuzPeorth

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

Bjr,
Pourquoi utiliser un regex (qui est très gourmand en ressource), alors qu'un simple cut devrait être suffisant ?

shopt -s globstar
while read fichier
do
  if grep -q CHAINE_A_TROUVER "${fichier}"; then
    content=$(grep 'name="ID" content="' "${fichier}" | cut -d '"' -f 4)
  fi
done < <(printf '%s\n' /home/user/dossier/**/*)

J'ai pas testé, mais ca devrait ressembler à un truc du genre ...


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#9 Le 19/08/2011, à 08:48

survietamine

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

oui, à condition que le champs soit toujours en position 4 wink


Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?

Hors ligne

#10 Le 19/08/2011, à 10:02

thomine

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

Merci AnsuzPeorth pour ta contribution. Elle est intéressante.
J'ai juste une erreur de syntaxe à l'exécution, sur le

done < <(printf '%s\n' /home/user/dossier/**/*)

Je ne comprends pas pourquoi et j'ai du mal à corriger car je ne comprends pas trop le "< <("*
Remarque, mon champ ID est a priori toujours à la même position sur la ligne, donc le découpage sur les " devraient fonctionner.

Dernière modification par thomine (Le 19/08/2011, à 10:04)

Hors ligne

#11 Le 19/08/2011, à 10:12

survietamine

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

salut, voici un extrait du manpage de bash :
*      Matches  any string, including the null string.
When the globstar shell option is enabled, and * is used in a pathname expansion context,
two adjacent *s used as a single pattern will match all files and zero or more directories and subdirectories.
If followed by a /, two adjacent *s will match only directories and subdirectories.

Dernière modification par survietamine (Le 19/08/2011, à 10:17)


Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?

Hors ligne

#12 Le 19/08/2011, à 10:53

thomine

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

Merci survietamine pour ta réponse mais je pense que l'erreur est sur les <<.
J'ai bien setté le globstar mais j'ai une erreur d'exécution:

Syntax error: redirection unexpected

Hors ligne

#13 Le 19/08/2011, à 12:21

AnsuzPeorth

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

Bjr,
Tu doit lancer ton script en sh. Il faut préciser si tu veux faire ca en sh plutot qu'en bash ....
Si tu veux rester en sh, il faudra un pipe de plus (tant pis smile)

#!/bin/sh
shopt -s globstar
printf '%s\n' /home/user/dossier/**/* | while read fichier
do
  if grep -q CHAINE_A_TROUVER "${fichier}"; then
    content=$(grep 'name="ID" content="' "${fichier}" | cut -d '"' -f 4)
  fi
done

Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#14 Le 19/08/2011, à 13:03

thomine

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

Super merci AnsuzPeorth, j'avais effectivement mis ça dans un script sh et je comprends mieux cette syntaxe, avec le printf en haut ! smile

Hors ligne

#15 Le 19/08/2011, à 13:55

AnsuzPeorth

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

thomine a écrit :

Super merci AnsuzPeorth, j'avais effectivement mis ça dans un script sh et je comprends mieux cette syntaxe, avec le printf en haut ! smile

Mais il est préférable d'éviter au maximum les pipes, ca lance des sous processus, donc plus de ressource systèmes nécessaire.
Si tu as bcp de fichier à traiter, il serait même préférable de ne pas utiliser grep et cut (il y a moyen en full bash)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#16 Le 02/09/2011, à 18:44

jcezanna56

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

AnsuzPeorth a écrit :

Mais il est préférable d'éviter au maximum les pipes, ca lance des sous processus, donc plus de ressource systèmes nécessaire.

Non les pipes sont un mécanisme système qui est parmi les plus performant des systèmes unix.
Il permet dans le cas de script simple comme dans cet exemple d'éviter de passer par la création totale d'un fichier temporaire, éventuellement sur disque, en synchronisant la sortie et l'entrée d'un processus pour une taille finie de donnée, donc en restant dans le cache mémoire.
En outre , il n'influe pas sur le nombre de processus

1)
cmd1 >ftmp
cmd2 <ftmp
rm ftmp
2)
cmd1 | cmd2

c'est le 2 qui est le plus rapide, le plus simple à écrire et qui demande le moins de ressource au système.
Alors pourquoi s'en priver ?

Hors ligne

#17 Le 05/09/2011, à 10:52

FRUiT

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

Si, un pipe ouvre un sous-shell. Merci de ne pas raconter n'importe quoi quand même...



man bash a écrit :

   Pipelines
       A pipeline is a sequence of one or more commands separated by one of the control operators | or |&.  The format for a pipeline is:

              [time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]

       [...]

       Each command in a pipeline is executed as a separate process (i.e.,  in  a  sub‐shell).

Dernière modification par FRUiT (Le 05/09/2011, à 11:01)


Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean

Hors ligne

#18 Le 05/09/2011, à 14:29

AnsuzPeorth

Re : [Résolu] Extraire un motif de fichiers répondant à un critère donné

Je n'écris aucun fichier temporaire dans mon exemple !!!


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne