xargs: problemas con los argumentos {}

{} es el marcador por defecto para los argumentos que pasamos al comando xargs. Existe la opción de renombrar este marcador para hacer más comprensible el comando y/o evitar problemas como el que podemos ver a continuación:

# grep xx@xxxx.es /var/log/exim_mainlog | awk '{print $3}' | sort -u | xargs grep {} /var/log/exim_mainlog

grep: 1QmbRA-0003Ba-4E: No such file or directory
grep: 1QmdAR-0001To-DY: No such file or directory
grep: 1QmeHn-0002ZO-Ib: No such file or directory
grep: 1Qmfzd-0008TC-Lc: No such file or directory
grep: 1QmgoV-0002aV-Vo: No such file or directory
grep: 1QmhPk-0000Ou-UV: No such file or directory
grep: 1Qmi22-0007kj-B3: No such file or directory
grep: 1Qmifd-0006ur-3S: No such file or directory

Como podéis ver el argumento, que es el identificador del correo lo recibe correctamente pero genera problemas a la hora de ejecutar el xargs. En casos como estos, si no tenéis tiempo para revisar el problema podéis probar a renombrar {} por una cadena de texto con el parámetro -I y verificar si de ese modo funciona:

# grep xx@xxxx.es /var/log/exim_mainlog | awk '{print $3}' | sort -u | xargs -I marcador grep marcador /var/log/exim_mainlog

011-07-29 16:14:38 1Qmnpl-0000za-U7 H=([XX.XX.XX.230]) [XX.XX.XX.XX]Warning: "SpamAssassin as xx detected message as NOT spam (-0.2)"
2011-07-29 16:14:38 1Qmnpl-0000za-U7  xxx  R=virtual_user T=virtual_userdelivery
2011-07-29 16:14:39 1Qmnpl-0000za-U7 => xx@xx.es  R=lookuphost T=remote_smtp H=xx.xx.es [xx.xx.xx.xx] X=TLSv1:DHE-RSA-AE3256-SHA:256
2011-07-29 16:14:39 1Qmnpl-0000za-U7 Completed

Efectivamente así ha funcionado correctamente.