Juin 142011
 

ce script permet de rechercher un mot dans une liste sauf que le résultat n’est pas le mot tant recherché, mais une liste des mots s’y rapprochant.

bon, c’est pas parfait mais ça fonctionne plutôt bien, il manque un truc que j’aimerais bien rajouter si j’ai du temps, c’est l’inversion des caractères pour corriger certaines fautes de typo.

Download : exhaustive_research.sh#!/bin/ksh -a
#
###############################################################################
###
# Auteur: Cedrick Gaillard
# Version 0.5.0
# Contributeurs: Cedrick Gaillard
#
# 0.4.0 07-jun-07: Creation
# 0.5.1 07-sep-07: correction d’un calcul mal ecrit (caractere ‘}’ en trop).
# 0.6.0 08-jul-08: modification du message de resultat de la recherche
#
###############################################################################

# principe de la recherche:
# en dessous de TAILLE_MIN on ne recherche pas
#
# en dessous de TAILLE_MAX on effectue une recherche restrictive, chaque
# caractere est successivement remplace par un ‘.’ et le mot a rechercher est
# entoure par les delimiteurs ‘debut’ et ‘fin’ de ligne.
# exemple de masque de recherche pour le mot ‘123’:
# « ^.23$|^1.3$|^1.3.$ »
#
# au dessus de TAILLE_MAX on passe a l’etape superieure, le champ de recherche
# est beaucoup plus grand.
# il n’y a pas de delimiteur ‘debut’ et ‘fin’ de ligne, la recherche est
# exhaustive.
# chaque caracteres est successivement remplace par un ‘.’
# si dans le mot a rechercher il y a plusieurs fois le meme caractere, en ce
# cas il y a substitution des caracteres identiques par un ‘.’
# masque de recherche pour le mot ‘12345678’
# « .2345678|1.345678|12.45678|123.5678|1234.678|12345.78|123456.8|1234567. »
# masque de recherche pour le mot ‘11234456’
# « ..23..56|..23..56|…3..56|..2…56|..23..56|..23..56|..23…6|..23..5. »
# masque de recherche pour le mot ‘compteur’ <== plus parlant surement # ".ompteur|c.mpteur|co.pteur|com.teur|comp.eur|compt.ur|compte.r|compteu." # # le tout est finalement parse avec egrep. # ############################################################################### DICTIONNAIRE=$1 MOT_A_RECHERCHER="$2" TAILLE_MIN=3 TAILLE_MAX=4 # sous solaris, seul l'expr du rep /usr/ucb fonctionne PATH="/usr/ucb:/usr/xpg4/bin:/bin/usr/bin:/$PATH" TMPFILE=/tmp/$$.${0##*/}.$RANDOM mkdir -p $TMPFILE NAME_ALL="$(cat ${DICTIONNAIRE}|egrep -v "^$|^#")" LONGUEUR_DU_MOT="$(echo $MOT_A_RECHERCHER |nawk '{print length($0)}')" cp /dev/null $TMPFILE/test_length cp /dev/null $TMPFILE/test_length_duplicate if [ "$LONGUEUR_DU_MOT" -ge "$TAILLE_MIN" -a "$LONGUEUR_DU_MOT" -le "$TAILLE_MAX" ] then POSITION_DU_POINT=0 occurence= while [ 1 ] do [ -n "$occurence" ] && echo "^${occurence}$" [ "$POSITION_DU_POINT" -eq "$LONGUEUR_DU_MOT" ] && break POSITION_DU_POINT="$((${POSITION_DU_POINT}+1))" [ "$POSITION_DU_POINT" -eq "1" ] && { occurence=".$(expr substr $MOT_A_RECHERCHER 2 $LONGUEUR_DU_MOT)" continue } [ "$POSITION_DU_POINT" -eq "$LONGUEUR_DU_MOT" ] && { occurence="${occurence}." continue } start_first=1 stop_inter=$((${POSITION_DU_POINT}-1)) start_inter=$((${POSITION_DU_POINT}+1)) stop_last=$((${LONGUEUR_DU_MOT}-${POSITION_DU_POINT})) first_block=$(expr substr $MOT_A_RECHERCHER $start_first $stop_inter) last_block=$(expr substr $MOT_A_RECHERCHER $start_inter $stop_last) occurence="${first_block}.${last_block}" done >>$TMPFILE/test_length
elif [ « $LONGUEUR_DU_MOT » -gt « $TAILLE_MAX » ]
then
# y a-t’il des lettres identiques dans le mot a rechercher ?
POSITION_DANS_MOT=0
while [ 1 ]
do
[ « $POSITION_DANS_MOT » -eq « $LONGUEUR_DU_MOT » ] && break
POSITION_DANS_MOT= »$((${POSITION_DANS_MOT}+1)) »

printf « $(expr substr $MOT_A_RECHERCHER $POSITION_DANS_MOT 1)\n »
done |sort |uniq -d >$TMPFILE/test_length_duplicate

# calcul des possibilites
POSITION_DU_POINT=0
while [ 1 ]
do
[ « $POSITION_DU_POINT » -eq « $LONGUEUR_DU_MOT » ] && break
POSITION_DU_POINT= »$((${POSITION_DU_POINT}+1)) »

POSITION_DANS_MOT=0 #on remet le compteur a zero a chaque fois
occurence=

while [ 1 ]
do
[ « $POSITION_DANS_MOT » -eq « $LONGUEUR_DU_MOT » ] && break
POSITION_DANS_MOT= »$((${POSITION_DANS_MOT}+1)) »

[ « $POSITION_DU_POINT » -eq « $POSITION_DANS_MOT » ] && occurence= »${occurence}. » && continue

lettre_en_cours= »$(expr substr $MOT_A_RECHERCHER $POSITION_DANS_MOT 1) »
if [ « $(egrep -ic « ^${lettre_en_cours}$ » $TMPFILE/test_length_duplicate) » = « 1 » ]
then
occurence= »${occurence}. »
continue
fi

[ « $POSITION_DU_POINT » -ne « $POSITION_DANS_MOT » ] && occurence= »${occurence}${lettre_en_cours} »
done

echo « $occurence » >>$TMPFILE/test_length
done
fi

if [ « $LONGUEUR_DU_MOT » -ge « $TAILLE_MIN » ]
then
final_research_value=
while read research_value
do
[ -z « $final_research_value » ] && final_research_value= »$research_value » && continue
final_research_value= »${final_research_value}|$research_value »
done <$TMPFILE/test_length DEBUG exhaustive_research "[$final_research_value]" RESULT_EX_RESEARCH="$(echo "${NAME_ALL}" |egrep -i "$final_research_value" |tr "\n" " ")" [ -n "$RESULT_EX_RESEARCH" ] && { echo "voici une liste d'elements se rapprochant de votre recherche:" echo " $RESULT_EX_RESEARCH" } fi rm -r $TMPFILE [/bash]

bien sûr ce script est très largement améliorable et optimisable.

Juin 102011
 

bdf amélioré sur une seule ligne:

  • affiche sur une seule ligne chaque FS
  • affiche le type de FS
  • affiche les Inodes
  • convertit les tailles dans un format humainement lisible
  • affiche un total de l’espace présent/utilisé/disponible en fin
Download : bdf.pl


exemple de sortie :

$ bdf.pl
File System         Size     Used    Avail %Used   Inodes    IFree %IUsed Type Mounted on
/dev/vg00/lvol3    1.97G  314.57M    1.65G   16%     2581    54443     5% vxfs /
/dev/vg00/lvol1    1024M  147.29M  869.96M   14%      144    28048     1% vxfs /stand
/dev/vg00/lvol8       6G    3.44G    2.54G   58%    42861    83763    34% vxfs /var
/dev/vg00/lvol7       4G    3.25G  761.31M   81%    56491    24533    70% vxfs /usr
/dev/vg00/lvol6    7.81G    3.09G    4.69G   40%    55047   154809    26% vxfs /opt
/dev/vg00/lvol5       2G   16.38M    1.97G    1%       12    64980     0% vxfs /tmp
/dev/vg00/lvol4       2G   16.29M    1.97G    1%        4    64988     0% vxfs /data
         Total:   24.78G   10.26G   14.40G
 Publié par à 12 h 50 min  Taggué avec :
Juin 092011
 

voici une fonction permettant de calculer le temps qu’utilise un élément d’un script perl.

Download : calcultime.pl

#!/usr/bin/perl
use strict ;
use warnings ;
use Time::HiRes qw( gettimeofday tv_interval) ;
 
sub calcultime {
	my ($seconds, $microseconds) = gettimeofday;
	if( !ref($_[0]) ) {
		my $ref = [ ($seconds, $microseconds) ] ;
		return ($ref) ;
	}
	else {
		my ($oldtime, $name) = @_ ;
		my ($oldseconds, $oldmicroseconds) = @$oldtime ;
		my $elapsed = tv_interval( [$oldseconds, $oldmicroseconds, [$seconds, $microseconds]] );
		return($elapsed);
	}
}

utilisation:
Continue reading »

 Publié par à 15 h 54 min  Taggué avec :