Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1560 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Shell Linux] Recherche dans un fichier evolué

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Shell Linux] Recherche dans un fichier evolué

n°2261966
chico008
what the wookie says ?
Posté le 06-07-2015 à 19:45:16  profilanswer
 

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
mood
Publicité
Posté le 06-07-2015 à 19:45:16  profilanswer
 

n°2261970
xilebo
noone
Posté le 06-07-2015 à 20:46:52  profilanswer
 

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.

n°2261971
chico008
what the wookie says ?
Posté le 06-07-2015 à 21:19:25  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Shell Linux] Recherche dans un fichier evolué

 

Sujets relatifs
Extraire du float d'un fichier en .txtBesoin d'aide: parser un fichier javascript
Utiliser un priphérique MIDI usb avec Ada sur Gnu/Linux.Récupérer extension d'un fichier
Supprimer extension fichierWordpress - modifier langue du moteur de recherche
test si un fichier est déja ouvert ou non , HELP !!!classe fichier SVP
liste de fichiers dans un array trié par date : 3eme fichier non listé 
Plus de sujets relatifs à : [Shell Linux] Recherche dans un fichier evolué


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR