Problème script bash de nettoyage fichier

willy -  
 Utilisateur anonyme -
Bonjour,

J'essaye de créer un script en bash qui me permettra de nettoyer un fichier de log. Je m'explique, soit à considérer comme exemple que j'ai un fichier de log avec les lignes suivantes:

omega.contacts.msn.com TATA
12photos-665.ll.facebook.com TXT
a545.ac-images.myspacecdn.com A
76echo.edge.messenger.live.com HINFO

Le but de mon script est de récupérer les FQDN et de les ranger dans une variable var1 et de récupérer les types DNS dans un 2ème temps et les ranger dans var2 mais je suis confronté à un gros problème.

exemple du script:

#!/bin/bash
for line in 'cat $1'
do
echo "$line"
var1=${line%' '*}
var2=${line#*' '}
done

ce dernier ne m'affiche pas les lignes ci dessus comme ca devrait l'être en raison de l'espace qui sépare les 2 champs SVP quelqu'un aurait une solution à mon problème? ça marche parfaitement avec les ":" mais avec l'espace çà déconne. Je suis coincé Merci!!!

3 réponses

  1. Utilisateur anonyme
     
    while read fqdn dns; do echo "fqdn = $fqdn -- dns = $dns"; done < fichier
    on ne lit pas un fichier autrement.
    0
  2. willy
     
    Merci j'ai contourné le problème avec un IFS
    0
  3. Utilisateur anonyme
     
    Tu ajoutes une complexité à un faux-problème, qui n'existe qu'à cause de ton obstination à faire les choses de travers.
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      Tu as oublié le guillemets à la fin et voir aussi un exemple avec awk (comme quoi on peut lire le fichier autrement si on veut et il y en a encore pleins des manières de le faire)
      D'ailleurs la lecture d'un fichier dépends aussi de sa structure.

      En tout cas je préfère un obstiné qu'un qui demande de faire les choses à sa place. ;-)

      lami20j@debian-acer:~$ cat plop 
      omega.contacts.msn.com TATA 
      12photos-665.ll.facebook.com TXT 
      a545.ac-images.myspacecdn.com A 
      76echo.edge.messenger.live.com HINFO 
      lami20j@debian-acer:~$ while read fqdn dns; do echo "fqdn = $fqdn -- dns = $dns"; done < plop 
      fqdn = omega.contacts.msn.com -- dns = TATA 
      fqdn = 12photos-665.ll.facebook.com -- dns = TXT 
      fqdn = a545.ac-images.myspacecdn.com -- dns = A 
      fqdn = 76echo.edge.messenger.live.com -- dns = HINFO 
      lami20j@debian-acer:~$ awk '{print "fqdn = " $1 " -- dns = " $2}' plop 
      fqdn = omega.contacts.msn.com -- dns = TATA 
      fqdn = 12photos-665.ll.facebook.com -- dns = TXT 
      fqdn = a545.ac-images.myspacecdn.com -- dns = A 
      fqdn = 76echo.edge.messenger.live.com -- dns = HINFO 
      lami20j@debian-acer:~$
      0
    2. Utilisateur anonyme
       
      J'ai corrigé le guillemet manquant. merci.

      et effectivement, on peut lire un fichier en awk, en perl, en python, et pourquoi pas en C, mais en n'utilisant que des commandes shell, il n'y a pas 36 solutions correctes.
      0
    3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

      mais en n'utilisant que des commandes shell, il n'y a pas 36 solutions correctes.
      En revanche il y en à sûrement d'autres manières pour le dire ;-)
      Et puis on est là pour proposer notre aide pas pour l'imposer ;-))

      Toutefois je t'invite de lire ça
      0
    4. Utilisateur anonyme
       
      «Si la boucle "while" reste la méthode la plus simple, elle a toutefois un inconvénient majeur, à savoir qu'elle annihile le formatage des lignes et notamment les espaces et tabulations»

      ce que dit jipicy n'est pas totalement vrai :


      cat fichier
              foo     foo #'tab' 'foo' 'tab' 'foo'
         bar   bar #'3 espaces' 'bar' '3 espaces' 'bar'
       baz baz #espace 'baz' espace 'baz'
      
      while read; do echo "$REPLY"; done < fichier
              foo     foo #'tab' 'foo' 'tab' 'foo'
         bar   bar #'3 esapces' 'bar' '3 espaces' 'bar'
       baz baz #'espace' 'baz' 'espace' 'baz'
      
      while IFS='' read line; do echo "line"; done < fichier
              foo     foo #tab 'foo' tab 'foo'
         bar   bar #'3 espaces' 'bar' '3 espaces' 'bar'
       baz baz #'espace' 'baz' 'espace' 'baz'
      0
    5. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

      D'accord pour REPLY, bien joué ;-)
      Sinon pour la 2ème solution Tu ajoutes une complexité à un faux-problème, ;-DDD
      0