Problème script bash de nettoyage fichier

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. while read fqdn dns; do echo "fqdn = $fqdn -- dns = $dns"; done < fichier
    on ne lit pas un fichier autrement.
    0
    1. Merci j'ai contourné le problème avec un IFS
      0
      1. Tu ajoutes une complexité à un faux-problème, qui n'existe qu'à cause de ton obstination à faire les choses de travers.
        0
        1. Modérateur
          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. 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. Modérateur
          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. «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. Modérateur
          Re,

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