[Shell Linux] Recherche dans un fichier evolué

Recherche dans un fichier evolué [Shell Linux] - Shell/Batch - Programmation

Marsh Posté le 06-07-2015 à 19:45:16    

Bonjour
Je suis confronté a un soucis actuellement au boulot.
 
je doit rechercher, dans un fichier plus ou moins structuré, une info, ca avec grep, pas de soucis, par contre, il me faut aussi en retour d'autres informations.
 
Voici un exemple de scructure de mon fichier :

Code :
  1. /* ----------------- fw_bullprod03_Bull_PRI_UTIL_SYSTEM ----------------- */
  2.    insert_job: fw_bullprod03_Bull_PRI_UTIL_SYSTEM   job_type: FW
  3.    box_name: Bull_PRI_UTIL_SYSTEM
  4.    machine: bullprod03
  5.    owner: root
  6.    permission:
  7.    alarm_if_fail: f
  8.    send_notification: n
  9.    watch_file: "/tmp/scp_util_system.ok"
  10.    watch_interval: 60


 
ma recherche porte sur le nom du job, via le champ insert_job.
je sais afficher ce champ. Par contre, il faut aussi que j'affiche, les champs machine, alarm_if_fail et watch_file, uniquement si ca correspond au insert_job que je recherche.
 
Avez vous une idée de comment faire ca ? je pensait a du awk, mais je ne maitrise pas asser.
 
Merci de votre aide.


---------------
Serveur HFR - OpenTTD
Reply

Marsh Posté le 06-07-2015 à 19:45:16   

Reply

Marsh Posté le 06-07-2015 à 20:46:52    

Salut :)
 
je ne suis pas bon en shell script mais j'ai fait ca, ca a l'air de fonctionner ( les pros me corrigeront ! )
 
Effectivement, avec awk on peut s'en sortir.
 

Code :
  1. #!/bin/sh
  2. test=0
  3. while read line
  4. do
  5.         champ=`echo $line | awk -F ":" '{print $1}'`
  6.         value=`echo $line | awk -F ":" '{print $2}'`
  7.         if [ $champ = "insert_job" ]
  8.         then
  9.                 if [ $value = "fw_bullprod03_Bull_PRI_UTIL_SYSTEM" ]
  10.                 then
  11.                         test=1
  12.                 fi
  13.         fi
  14.         if [ $test -eq 1 ]
  15.         then
  16.                 if [ $champ = "machine" ]
  17.                 then
  18.                         machine=$value
  19.                 elif [ $champ = "alarm_if_fail" ]
  20.                 then
  21.                         alarm=$value
  22.                 elif [ $champ = "watch_file" ]
  23.                 then
  24.                         watch=$value
  25.                 fi
  26.         fi
  27. done < test.txt
  28. if [ $test -eq 1 ]
  29. then
  30.         echo "machine :" $machine
  31.         echo "alarm :" $alarm
  32.         echo "file:" $watch
  33. fi


 
Aucune vérif par contre, ca suppose 3 choses :
 - virer le commentaire du début qui fout la merde je sais pas pourquoi ( je me retrouve avec le contenu de "ls /" dans la première ligne )
 - job_type se trouve une ligne en dessous et pas sur la même ligne
 - la ligne insert_job se trouve avant les lignes machine / alarm_if_fail / watch_file
 
Ca aurait pu se faire en perl ou en python également.

Reply

Marsh Posté le 06-07-2015 à 21:19:25    

au final j'ai trouver, j'avait oublier que le Grep de Linux pouvait affichier les lignes suivant le paterne.
 
du coup j'ai fait une première boucle pour recuperer que els lignes avec mon patern, puis une 2nd, qui lit mon resultat de la 1er boucle, cherche le patern dans le fichier avec affichage de ligne supplementaires, qui sont gréppé elles aussi sur les champs que je veut :)
 
ca donne un truc fait a l'arache comme ca

Code :
  1. #!/bin/ksh
  2. rm -f Filewatcher.lst 2>/dev/null
  3. #premiere lecture : FW
  4. grep " fw_" COMPLET.JIL | grep -v "\/\*" | grep "job_type: FW" | awk '{print $2}' > lst_fw.tmp
  5. #deuxieme lecture, recup machine, fichier concerné et alarme
  6. cat lst_fw.tmp | while read line
  7. do
  8.         grep -A 12 "insert_job: $line" COMPLET.JIL | egrep "insert_job|machine|alarm_if_fail|watch_file" > job.tmp
  9.         JOBNAME=$(grep "insert_job" job.tmp | awk '{print $2}')
  10.         MACHINE=$(grep "machine" job.tmp | awk '{print $2}')
  11.         ALARM=$(grep "alarm" job.tmp | awk '{print $2'})
  12.         FILEWA=$(grep "watch" job.tmp | awk '{print $2'})
  13.         echo "${JOBNAME};${MACHINE};${FILEWA};${ALARM}" >> Filewatcher.lst
  14. done


 
vive le grep -A x


---------------
Serveur HFR - OpenTTD
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed