OVH Cloud OVH Cloud

Rechercher une ligne dans un gros fichier trié

25 réponses
Avatar
J.Pierre Pourrez
Bonjour,

J'utilise grep pour rechercher une ligne dans un fichier trié de 14000
lignes.
Je suppose que la recherche se fait ligne par ligne dans le fichier et
cela me semble un peu bourrin quand la recherche s'effectue plusieurs
centaines de fois.

Existe-t-il un remplaçant pour grep qui effectue une recherche plus
rapide genre recherche par dichotomie ?

Je souhaite utiliser cela dans un script shell.

D'avance merci
Jean-Pierre



--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org

10 réponses

1 2 3
Avatar
J.Pierre Pourrez
Le 15/11/04 à 10:39, Sébastien GALLET écrivait:

Si j'ai bien compris, tu utilises apt-proxy pour faire un mirroir de sarge.


Oui, apt-proxy est seulement un proxy "intelligent".
Il ne va chercher sur Internet que les paquets qu'on lui demande et pour
savoir si le paquet qu'il a dans son cache est la dernière version, il
consulte le fichier Packages
Apt-proxy 1.3 est lancé par xinetd donc pas de serveur supplémentaire

As-tu essayé apt-mirror : http://apt-mirror.sourceforge.net/ ?


Non.
Si c'est pour mirrorer l'équivalent des 14 CDs de la Sarge, c'est non
merci.
En plus, il est inconnu sur http://www.debian.org/distrib/packages
et la dernière mise à jour date de juillet 2003 (Mainteneur ?)

Bye
Jean-Pierre


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Sébastien GALLET
J.Pierre Pourrez a écrit :

Le 15/11/04 à 10:39, Sébastien GALLET écrivait:


Si j'ai bien compris, tu utilises apt-proxy pour faire un mirroir de sarge.



Oui, apt-proxy est seulement un proxy "intelligent".
Il ne va chercher sur Internet que les paquets qu'on lui demande et pour
savoir si le paquet qu'il a dans son cache est la dernière version, il
consulte le fichier Packages
Apt-proxy 1.3 est lancé par xinetd donc pas de serveur supplémentaire


apt-mirror est lancé par mon ami cron pendant que je dors ...


As-tu essayé apt-mirror : http://apt-mirror.sourceforge.net/ ?



Non.
Si c'est pour mirrorer l'équivalent des 14 CDs de la Sarge, c'est non
merci.


c'est pire que ça ;)
du -h /mirror/debian : 29G
En plus, il est inconnu sur http://www.debian.org/distrib/packages


Normal, ce n'est pas un paquet "officiel"
et la dernière mise à jour date de juillet 2003 (Mainteneur ?)


au moins il est plus récent que grep ;) : 2002-03-26

Bye
Jean-Pierre




Seb


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Pierre Meurisse
> >Si c'est pour mirrorer l'équivalent des 14 CDs de la Sarge, c'est non
>merci.
c'est pire que ça ;)
du -h /mirror/debian : 29G
>En plus, il est inconnu sur http://www.debian.org/distrib/packages
Normal, ce n'est pas un paquet "officiel"
>et la dernière mise à jour date de juillet 2003 (Mainteneur ?)
au moins il est plus récent que grep ;) : 2002-03-26
>


il y a aussi apt-move, qui forme une arborescence debian à partir des
fichiers trouvés dans /var/cache/apt/archives, et qui permet aussi de
synchroniser avec les paquets installés.

L'ennui, c'est qu'il y a un bug de gawk qui l'empêche de fonctionner en
ce moment. J'attends avec impatience qu'il soit corrigé.

#264786: broken gawk hangs apt-move

A propos, mon répertoire /var/cache/apt/archives enfle de façon
dramatique. Si quelqu'un connait une façon de contourner ...

A+

--
Pierre Meurisse
Utilisateur Linux n° 160794


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Sebastien Mathy
Le Lundi 15 Novembre 2004 18:03, Pierre Meurisse a écrit :
A propos, mon répertoire /var/cache/apt/archives enfle de façon
dramatique. Si quelqu'un connait une façon de contourner ...



apt-get clean ?

--
Sebastien Mathy
Avatar
Pierre Meurisse
On Mon, Nov 15, 2004 at 06:27:08PM +0100, Sebastien Mathy wrote:
Le Lundi 15 Novembre 2004 18:03, Pierre Meurisse a écrit :
> A propos, mon répertoire /var/cache/apt/archives enfle de façon
> dramatique. Si quelqu'un connait une façon de contourner ...

apt-get clean ?



je connais, mais il y avait avant :

il y a aussi apt-move, qui forme une arborescence debian à partir des
fichiers trouvés dans /var/cache/apt/archives, ...



Je garde donc mes paquets en réserve en espérant que le bug va bientôt
être corrigé.

A+

--
Pierre Meurisse
Utilisateur Linux n° 160794


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Yves Rutschle
On Sun, Nov 14, 2004 at 07:42:38PM +0100, J.Pierre Pourrez wrote:
Le script est executé une fois par semaine, le fichier de 14000 lignes
est créé à chaque fois et correspond aux 14000 paquets de la Sarge.



Optimiser un script qui prend 5 minutes à s'executer toutes
les semaines n'est pas une bonne utilisation de son temps :)


Je vois au moins un changement à faire:

# recenser tous les noms de fichiers des paquets dans Packages
for PACKAGE in `find $DISTS_DIR -name Packages`; do
grep $MOTIF $PACKAGE | sed "s!$MOTIF!$HOST/!" >> $TMPFILE
done
# on trie tous les noms de fichiers récupérés
mv $TMPFILE $TMPFILE.orig
cat $TMPFILE.orig | sort > $TMPFILE
rm $TMPFILE.orig



Je remplacerai tout ça par:

cat `find $DISTS_DIR -name Packages` | grep $MOTIF | sed "s!$MOTIF!$HOST/!" | sort > $TMPFILE

(Ça marche les points d'exclamation? Mon shell n'a pas l'air
content avec ça...)

# on supprime les paquets non recensés
# éventuellement utiliser l'option -m de grep pour arrêter
# la recherche à la première occurence
for FICHIER in `find $HOST -name "*.deb"`; do
if [ `grep -c $FICHIER $TMPFILE` = "0" ]; then
echo "Remove $FICHIER"
rm -f $FICHIER
COUNT=$(($COUNT+1))
fi
done



Ok, c'est donc la partie dont tu parlais à l'origine. Je
n'ai pas d'idée évidente; une solution serait de construire
un script sed qui efface les lignes contenues dans $TMPFILE,
et l'appliquer à la sortie du find, donc qqch du genre:

sed -e "s///\//g" -e "s!(.*)!/1/d!" $TMPFILE > $TMPFILE2

(pour se retrouver dans $TMPFILE2 avec des lignes du genre:
//var/lib/apt-proxy/blahblah.deb/d
//var/lib/apt-proxy/foobar.deb/d
...


Puis:
find $HOST -name "*.deb" | sed -f $TMPFILE2

(on peut alors retirer le `sort` de l'expression du haut, il
ne sert plus).

Selon l'implémentation de sed (et si sed arrive à gérer
14000 lignes de script...), ça peut être ou ne pas être
plus rapide que ta solution.

Y.


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Thomas Labourdette
Le lundi 15 Novembre 2004 09:06, J.Pierre Pourrez a écrit :
Le 14/11/04 à 23:26, Yves Rutschle écrivait:

> N'est pas ce à quoi sert la variable CLEANUP_DAYS dans
> /etc/apt-proxy/apt-proxy.conf?

Pas vraiment
Pour supprimer un paquet, il faut télécharger une nouvelle version du
paquet, et que le paquet soit plus vieux que CLEANUP_DAYS jours.



C'est pour ça qu'il y a CLEAN_SWEEP. Tout paquet non accédé depuis le nombre
de jours définis par CLEAN_SWEEP est supprimé.

@+
--
Jean BALLE (signature aléatoire)
Dictionnaire Français-Japonais
Prendre une photo : Yakapabougé


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Yves Rutschle
On Tue, Nov 16, 2004 at 10:44:42AM +0000, Yves Rutschle wrote:
Ok, c'est donc la partie dont tu parlais à l'origine. Je
n'ai pas d'idée évidente



En fait si:
- On a la liste des fichiers "installés" (.deb présent dans
/var/cache/apt-proxy):

find /var/cache/apt-proxy -name "*.deb" | sort > $TMPFILE1

- On a la liste des fichiers "valides" (mentionné dans un
fichier Package):

cat `find $DISTS_DIR -name Packages` | grep $MOTIF | sed "s!$MOTIF!$HOST/!" | sort > $TMPFILE2

On trouve maintenant facilement quels paquets peuvent être effacés:

diff -u $TMPFILE2 $TMPFILE1 | grep "^+" | sed -e "s/^+//" | xarg rm -f

Tadaaaa!

Y - qui vient d'effacer 874 paquets obsolets.


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
J.Pierre Pourrez
Le 16/11/04 à 11:42, Yves Rutschle écrivait:

- On a la liste des fichiers "installés" (.deb présent dans
/var/cache/apt-proxy):

find /var/cache/apt-proxy -name "*.deb" | sort > $TMPFILE1

- On a la liste des fichiers "valides" (mentionné dans un
fichier Package):

cat `find $DISTS_DIR -name Packages` | grep $MOTIF | sed "s!$MOTIF!$HOST/!" | sort > $TMPFILE2

On trouve maintenant facilement quels paquets peuvent être effacés:

diff -u $TMPFILE2 $TMPFILE1 | grep "^+" | sed -e "s/^+//" | xarg rm -f



Comme les fichiers TMPFILE* sont triés, on doit pouvoir utiliser "comm" à
la place de diff et sed :
comm -23 $TMPFILE1 $TMPFILE2 | xargs rm -f

A tester !

Tadaaaa!


Tadadaaa !

Y - qui vient d'effacer 874 paquets obsolets.


Le ménage s'imposait ;-)
Jean-Pierre


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
J.Pierre Pourrez
Le 16/11/04 à 12:04, Thomas Labourdette écrivait:

C'est pour ça qu'il y a CLEAN_SWEEP. Tout paquet non accédé depuis le nombre
de jours définis par CLEAN_SWEEP est supprimé.



Les paquets qui sont encore d'actualité sont aussi effacés.

De plus, il me semble plus naturel de lancer le nettoyage d'un cache par
crontab à une heure de faible activité plutôt que par une requête HTTP

A+++
Jean-Pierre

--
Jean BALLE (signature aléatoire)


Dans quel état j'erre !!


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
1 2 3