#!/bin/bash
##############################################################################
# Recherche dans un groupe de fichiers l'existence d'une chaine de caracteres
#
# On utilise le paquet mlocate (updatedb et locate)
# Le fichier ou groupe de fichiers est recherche par locate
# appel : string2file [-l] [-d] -s 'string a localiser' -f 'nom du fichier'
# -l => parametre optionnel pour obtenir le numero de ligne
# -d => parametre optionnel pour afficher les lignes contenant la chaine
# -s => chaine a rechercher
# -f => nom du fichier fourni par locate (paquet mlocate)
#        Attention on recherche un string contenu dans le resultat de locate
#        si -f toto on recherche par locate toto. 
#        Dans ce cas avec cette requete qui fournit les resultats suivants :
#        /home/user/dir1toto/file1
#        /home/user/dir2toto/file2
#        on fera une recherche dans les fichiers file1 et file2
#
# lien symbolique searchstring dans /usr/local/bin (presence dans $PATH)
#    Creation lien symbolique
# ln -s /root/admin/string2file /usr/local/bin/searchstring
#
# appel : searchstring -s chaine -f fichier [-l] [-d]
#
#  Creation 24 Nov 2010 
#  MaJ 14 Dec 2010 - Utilisation sed pour les recherches / substitutions
##############################################################################

# Definition du fichier temporaire
FILE_LIST1='/tmp/s2file1' ; echo -n "" > $FILE_LIST1 

# Init des parametres transmis
line_search=""
file_search="" ; file_ok=0
strg_search="" ; strg_ok=0
disp_search=0

# Init des chaines de constantes
filler1='>==> '
filler2='<==> '

# analyse ligne
until [ $# -eq 0 ] ; do
  if [ "$1" == "-s" ] ; then
    shift ; strg_search=$1 ; strg_ok=1
  fi

  if [ "$1" == "-f" ] ; then
    shift ; file_search=$1 ; file_ok=1
  fi

  if [ "$1" == "-l" ] ; then
    line_search=$1
  fi

  if [ "$1" == "-d" ] ; then 
    disp_search=1
  fi

  if [ "$1" == "-h" ] ; then
    cat /root/admin/s2l.help
    exit
  fi

  shift
done

# Verification des param a minima (fichier et string)
if [ $(($file_ok+$strg_ok)) -ne 2 ] ; then
  echo "erreur : specifier -s string -f nom_fichier [-l] [-d]"
  echo "pour le fichier AIDE passer -h en parametre."
  exit
fi

############################################ Obtenir une liste puis eliminer les repertoires
locate $file_search > $FILE_LIST1
nbr=$(cat $FILE_LIST1 | wc -l)
pnt=1

############################################ Traitement des datas fournis par locate
# On considere chaque ligne fournie.
# Si la ligne ne pointe pas un fichier de data, on ne fait rien

while [ "$nbr" -ge "$pnt" ] ; do

  # extraction de la ligne de rang $pnt
  file_name=$(cat "$FILE_LIST1" | head -n "$pnt" | tail -n 1)

  if [ -f "$file_name" ] ; then
    # la ligne est un fichier 
    if [ $(cat "$file_name" | grep "$strg_search" | wc -l) -gt 0 ] ; then
      # afficher les infos minimales
      echo -e -n "==> Occurences = "$(cat "$file_name" | grep $strg_search | wc -l)"\t String = "$strg_search"\t File = "$file_name

      # traitement option -l
      if [ "$line_search" == "-l" ] ; then
         echo -e -n " \t" $filler2 $(sed -n "/"$strg_search"/ = " $file_name) 
         # Recup des numeros de ligne qui contiennent le pattern fourni par $strg_search
         # Attention a l'usage des single et doubble quotes pour encadrer la variable $strg_search
      fi
      echo ""

      # traitement option -d
      if [ "$disp_search" -eq 1 ] ; then
        cat $file_name | grep "$strg_search" | sed 's/^ \{1,99\}//' | sed 's/^\t\{1,99\}//' | sed 's/^/  > /'
        # le premier   sed elimine les n espaces de debut de ligne, le deuxieme les tabulations
        # le troisieme sed insert un preambule de ligne ( > )
        echo -e "\t" "$filler2"
      fi

    fi   # Fin de traitement de fichier non vide
  fi     # Fin de traitement si fichier data
  let pnt++
done     # Fin de boucle de traitement du fichier fourni par locate

