#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
Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?
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 )
#!/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 !
Hors ligne
#15 Le 19/08/2011, à 13:55
- AnsuzPeorth
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 !
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é
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...
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