Pourquoi awk exécute-t-il les deux actions?

Quand j'exécute la command:

awk '/from/ {print $7} /to/ { print $7}' erroMuitoDoido.txt 

Le file est:

 May 19 04:44:43 server postfix/smtpd[32595]: CDAB515013: client=servidor.dominio.com.br[10.10.10.44] May 19 04:44:43 server postfix/cleanup[18651]: CDAB515013: message-id=<20120519074443.CDAB515013@servidor2.dominio.com.br> May 19 04:44:43 server postfix/qmgr[16684]: CDAB515013: from=atendimento@dominio.com.br, size=19590, nrcpt=1 (queue active) May 19 04:44:50 server postfix/pipe[32596]: CDAB515013: to=userdestino@dominiodestino.com.br, relay=dovecot, delay=6.2, delays=0.02/6/0/0.14, dsn=2.0.0, status=sent (delivered via dovecot service) May 19 04:44:50 server postfix/qmgr[16684]: CDAB515013: removed 

La sortie est:

 from=atendimento@dominio.com.br, from=atendimento@dominio.com.br, to=userdestino@dominiodestino.com.br, 

Le problème est que la ligne "from=atendimento@dominio.com.br" se produit deux fois! Comment puis-je réparer cela?

Version AWK: GNU Awk 4.0.0
OS: Debian 6, OpenSuse 12.1, CentOS 6.2

 $ awk '/from=/ {print $7} /to=/ { print $7}' erroMuitoDoido.txt 

La raison est:

 from=atendimento@dominio.com.br, ^^ ^^ 

Toutes les actions sont exécutées dans l'ordre si l'input correspond au motif correspondant. Si l'input correspond aux deux templates, les deux actions sont exécutées.

Si vous voulez imprimer le champ s'il correspond à un model ou l'autre, combinez les deux:

 awk '/from/ || /to/ { print $7}' erroMuitoDoido.txt 

Ici, vous pouvez combiner les deux expressions en une seule expression rationnelle:

 awk '/from|to/ { print $7}' erroMuitoDoido.txt 

Pour ce que vous faites, vous devez ancrer la correspondance au début du champ, car vous ne voulez probablement pas faire correspondre les adresses électroniques qui contiennent la sous-string from ou to :

 awk '$7 ~ /^(from|to)=/ { print $7}' erroMuitoDoido.txt 

Si vous souhaitez un traitement différent, avec cette correspondance plus précise, vous pouvez utiliser des actions séparées car ces motifs ne se chevauchent pas.

 awk '$7 ~ /^from=/ { … } $7 ~ /^to=/ { … }' erroMuitoDoido.txt 

Si vous souhaitez arrêter de traiter d'autres actions et passer à la ligne suivante, vous pouvez utiliser le mot-key next .