Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

recuperation d'informations dans un fichier texte

6 réponses
Avatar
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

6 réponses

Avatar
Alain Ketterlin
Kevin Denis writes:

++======================================= > ||
|| 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.

Avatar
Kevin Denis
Le 29-05-2007, Alain Ketterlin a écrit :

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

Avatar
Marc Boyer
Le 29-05-2007, Kevin Denis a écrit :
Le 29-05-2007, Alain Ketterlin a écrit :

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)


Avatar
Alain Ketterlin
Kevin Denis writes:

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

Avatar
Alain Ketterlin
Alain Ketterlin writes:

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

Avatar
Kevin Denis
Le 29-05-2007, Alain Ketterlin a écrit :

$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