recuperation d'informations dans un fichier texte

Le
Kevin Denis
Bonjour,

je cherche à récuperer des informations dans un fichier texte. Le
fichier est de la forme:
++=
||
|| Package: ./a/aaa_base-11.0.0-noarch-2.tgz
||
++=
drwxr-xr-x root/root 0 2006-09-26 00:30:49 ./
drwxr-xr-x root/root 0 1997-10-06 03:10:09 bin/
drwxr-xr-x root/root 0 1997-10-06 03:10:09 dev/
drwxr-xr-x root/root 0 2006-09-26 00:30:48 etc/
()


++=
||
|| Package: ./a/aaa_elflibs-11.0.0-i486-9.tgz
||
++=
drwxr-xr-x root/root 0 2006-09-18 02:41:13 ./
drwxr-xr-x root/root 0 2006-09-18 02:41:12 lib/
-rwxr-xr-x root/root 11008 2003-09-17 02:43:05 lib/libtermcap.so.2.0.8
()

etc..

Nous avons un nom de paquet, suivis de la liste des fichiers contenus
dans ce paquet. Je voudrais trouver la manière de récupérer
le nom d'un paquet lorsque je fournis le nom d'un fichier.

J'ai écrit un script basique:

#! /bin/bash
IFS="
"
for line in `bzcat /mnt/cdrom/slackware/MANIFEST.bz2`
do
TMP_PACK=`echo "$line" | grep Package `
[ $? -eq 0 ] && PACK=$TMP_PACK
echo "$line" | grep "$1"
[ $? -eq 0 ] && echo $PACK
done


cela fonctionne, mais
1. c'est atrocement lent. Il faut compter quelques minutes deja
pour les premiers paquets. Pour les derniers (comme zsh), j'ai
abandonné au bout de 30mn
2. Ce script me mange de la RAM de facon phenomenale (+100Mo a
vue de nez)

Le fichier comprimé en bz2 fait 900ko et 138000 lignes. Ce qui
doit expliquer les deux points exprimes plus haut.

Mes questions:
comment ameliorer ce script?
faut il conserver decomprime le MANIFEST.bz2?

Merci
--
Kevin
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alain Ketterlin
Le #736308
Kevin Denis
++======================================= > ||
|| Package: ./a/aaa_base-11.0.0-noarch-2.tgz
||
++======================================= > drwxr-xr-x root/root 0 2006-09-26 00:30:49 ./
drwxr-xr-x root/root 0 1997-10-06 03:10:09 bin/
drwxr-xr-x root/root 0 1997-10-06 03:10:09 dev/
drwxr-xr-x root/root 0 2006-09-26 00:30:48 etc/
(...)

Je voudrais trouver la manière de récupérer le nom d'un paquet
lorsque je fournis le nom d'un fichier.


bzcat .../MANIFEST.bz2 |
awk ' $2=="Package:" { pack = $3; } $6=="'$FICHIER'" { print pack; }'

(FICHIER doit contenir le nom a rechercher). Si le meme fichier
apparait dans plusieurs packages, tu les auras tous.

-- Alain.

Kevin Denis
Le #736307
Le 29-05-2007, Alain Ketterlin

bzcat .../MANIFEST.bz2 |
awk ' $2=="Package:" { pack = $3; } $6=="'$FICHIER'" { print pack; }'

(FICHIER doit contenir le nom a rechercher). Si le meme fichier
apparait dans plusieurs packages, tu les auras tous.

C'est effectivement bien plus rapide:

$ time bzcat /mnt/cdrom/slackware/MANIFEST.bz2 |
awk ' $2=="Package:" { pack = $3; } $6=="bin/zsh" { print pack; }'
./ap/zsh-4.2.6-i486-1.tgz

real 0m12.902s
user 0m10.446s
sys 0m0.397s

Mais, la meme requete avec uniquement "zsh" ne renvoie aucune occurence.
Ca se joue au niveau du 6e champ, mais comment sont gerees les regexp
avec awk?
--
Kevin

Marc Boyer
Le #736306
Le 29-05-2007, Kevin Denis
Le 29-05-2007, Alain Ketterlin

bzcat .../MANIFEST.bz2 |
awk ' $2=="Package:" { pack = $3; } $6=="'$FICHIER'" { print pack; }'

(FICHIER doit contenir le nom a rechercher). Si le meme fichier
apparait dans plusieurs packages, tu les auras tous.

C'est effectivement bien plus rapide:

$ time bzcat /mnt/cdrom/slackware/MANIFEST.bz2 |
awk ' $2=="Package:" { pack = $3; } $6=="bin/zsh" { print pack; }'
./ap/zsh-4.2.6-i486-1.tgz

real 0m12.902s
user 0m10.446s
sys 0m0.397s

Mais, la meme requete avec uniquement "zsh" ne renvoie aucune occurence.
Ca se joue au niveau du 6e champ, mais comment sont gerees les regexp
avec awk?


Bin, $6=="bin/zsh" signifie <<le 6ème champs doit etre egal
à bin/zsh>>. Si tu veux un match seulement, essaye
$6~="zsh".

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Alain Ketterlin
Le #736305
Kevin Denis
$ time bzcat /mnt/cdrom/slackware/MANIFEST.bz2 |
awk ' $2=="Package:" { pack = $3; } $6=="bin/zsh" { print pack; }'
./ap/zsh-4.2.6-i486-1.tgz

real 0m12.902s
user 0m10.446s
sys 0m0.397s

Mais, la meme requete avec uniquement "zsh" ne renvoie aucune occurence.
Ca se joue au niveau du 6e champ, mais comment sont gerees les regexp
avec awk?


$6 ~ /zsh/ au lieu de $6 == "zsh"

(voire $6 ~ /zsh$/ pour un nom à la fin du champ, voire plus sioux si
il y a besoin)

-- Alain.

Alain Ketterlin
Le #736046
Alain Ketterlin
$6 ~ /zsh/ au lieu de $6 == "zsh"


Je me rends compte que mon lecteur de news (gnus) me met en italique
tout ce qui se trouve entre slashes... Donc, au cas où c'est pareil
chez vous : dans awk, une expression regulière est placée entre
slashes. Il faut donc lire :

$6 ~ <slash>zsh<slash>

Cela dit, on peut écrire $6 ~ "zsh" et la chaîne est transformée en
expression régulière.

-- Alain.

Kevin Denis
Le #736045
Le 29-05-2007, Alain Ketterlin

$6 ~ /zsh/ au lieu de $6 == "zsh"


Je me rends compte que mon lecteur de news (gnus) me met en italique
tout ce qui se trouve entre slashes...


slrn fait la coloration syntaxique mais a une options qui conserve
les caracteres places avant et apres les mots colores.
C'est tres utile dans une groupe comme celui ci.

Merci
--
Kevin


Publicité
Poster une réponse
Anonyme