Re: Rechercher une ligne dans un gros fichier trié
Le 14/11/04 à 19:03, Francois@mescam.org écrivait:
> Si chaque fois est suite à une action d'un opérateur humain les délais de grep
> sont raisonnables. je viens de faire un test (portable PIII 500Mhz, 512 Mo) :
> $ time grep -e 'zzzzzzzz' *
>
> real 0m0.071s
> user 0m0.030s
> sys 0m0.040s
> $ pwd
> /usr/share/doc/postgresql-doc/html
> $ wc -l *|grep total
> 329529 total
> $ du -hs
> 6,4M .
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.
Le but est de suuprimer les paquets obsolètes dans le cache de
apt-proxy. Voici où j'en suis arrivé
=========== cut here ===============================
#!/bin/sh
# supprime tous les packages obsolètes (non référencés dans les fichiers
# Packages) dans le cache d'Apt-proxy
TMPFILE=`mktemp -t purge.XXXXXX`
trap "rm -f $TMPFILE" 0 1 2 5 15
MOTIF="^Filename: "
# récupère la valeur de APT_PROXY_CACHE
APT_PROXY_CACHE=`grep "^APT_PROXY_CACHE=" /etc/apt-proxy/apt-proxy.conf | \
cut -d = -f 2`
COUNT=0
for H in `ls $APT_PROXY_CACHE`; do
HOST="$APT_PROXY_CACHE/$H"
echo "============== Host: $HOST ========================="
if [ -d "$HOST" ]; then
rm $TMPFILE
touch $TMPFILE
# certains sites n'ont pas de répertoire dists (E.G.: http://z42.de)
DISTS_DIR="$HOST/dists"
if [ ! -d "$DISTS_DIR" ]; then DISTS_DIR="$HOST"; fi
# 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
# 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
fi
done
N=`wc -l $TMPFILE`
echo -e "\nSweeping apt-proxy cache...\n$COUNT packets deleted / $N known packets\n"
======================= cut here =======================================
C'est vrai que le temps d'execution est acceptable
Si quelqu'un a une suggestion pour améliorer le script, je suis preneur
Merci pour votre aide à tous
Jean-Pierre
Reply to: