2010-04-18 2 views
0

J'ai un fichier délimité par l'espace. Je dois écrire une commande awk qui reçoit un argument de nom d'hôte et il devrait remplacer le nom d'hôte s'il est déjà défini dans le fichier. Il ne doit pas s'agir d'une correspondance complète - si le fichier contient ce nom d'hôte: localhost La recherche de "ho" échouera et sera ajoutée à la fin du fichier.comment supprimer une ligne du fichier en utilisant awk filtré par une chaîne

une autre option est une suppression: à nouveau awk reçoit l'argument du nom d'hôte et il doit le retirer du fichier s'il existe.

C'est ce que j'ai jusqu'à présent: (Il a besoin de quelques améliorations)

if [ "$DELETE_FLAG" == "" ]; then 
     # In this case the entry should be added or updated 
     # if clause deals with updating an existing entry 
     # END clause deals with adding a new entry 
     awk -F"[ ]" "BEGIN { found = 0;} \ 
       { \ 
         if ($2 == $HOST_NAME) { \ 
           print \"$IP_ADDRESS $HOST_NAME\"; \ 
           found = 1; \ 
         } else { \ 
           print \$0; \ 
         } \ 
       } \ 
       END { \ 
         if (found == 0) { \ 
           print \"$IP_ADDRESS $HOST_NAME\"; 
         } \ 
       } " \ 
     /etc/hosts > /etc/temp_hosts 

else 
     # Delete an existing entry 
     awk -F'[ ]' '{if($2 != $HOST_NAME) { print $0} }' /etc/hosts > /etc/temp_hosts 
fi 

Merci

Répondre

0

vous ne devez pas définir FS à l'espace, puisque par défaut FS est déjà espaces. Et vous ne devez pas utiliser \. Utilisez l'option -v pour transmettre les variables shell à awk. Et il n'y a pas besoin d'utiliser point-virgule à la fin de chaque déclaration

if [ "$DELETE_FLAG" == "" ]; then 
     # In this case the entry should be added or updated 
     # if clause deals with updating an existing entry 
     # END clause deals with adding a new entry 
     awk -v hostname="$HOST_NAME" -v ip="$IP_ADDRESS" 'BEGIN { found = 0} 
     { 
      if ($2 == hostname) { 
       print ip" "hostname 
       found = 1 
      } else { 
       print $0 
      } 
     } 
     END { 
      if (found == 0) { 
        print ip" "hostname 
      } 
     }' /etc/hosts > /etc/temp_hosts 

else 
     # Delete an existing entry 
     awk -v hostname="$HOST_NAME" '$2!=hostname' /etc/hosts > /etc/temp_hosts 
fi 
+0

Merci, cette modification a fait l'affaire! – embedded

0

Vous devez mettre les scripts awk à l'intérieur des guillemets simples et utiliser le passage variable pour obtenir les variables shell dans le script awk. Alors vous ne devrez pas faire tout ce qui s'échappe. Et je ne pense pas que les barres obliques inverses et les points-virgules soient nécessaires.

Les séparateurs de champ sont-ils des espaces ou des espaces entre crochets? De plus, il existe un léger risque que vos tests échouent si la variable contient une chaîne commençant par un tiret. Il y a au moins quelques manières de se protéger contre ceci:

if [ "" == "$DELETE_FLAG" ]; then # the dash isn't the first thing that `test` sees 
if [ x"$DELETE_FLAG" == x"" ]; then # ditto 
Questions connexes