Как использовать инвертированное совпадение в awk вместе с другими шаблонами - PullRequest
0 голосов
/ 21 марта 2020

Как использовать инвертированное совпадение с awk, как grep -v, у меня есть смесь шаблонов awk, sed, grep и sort ниже.

Есть ли чистый awk или sed способ сделать следующее. .

$ awk '/status=sent/{print $1,$2,$7,$8|"sort -u"}' /var/log/maillog-20150308 |sed 's/to=<//g' | sed 's/>,//g' | grep -v "relay=local"

Журнал образцов ..

Mar 15 09:00:12 testhost postfix/local[11995]: 7245441DF1: to=<user@smtp.tr-dub01.tr.com>, relay=local, delay=0.02, delays=0/0/0/0.02, dsn=2.0.0, status=sent (delivered to file: /dev/null)
Mar 15 09:00:12 testhost postfix/local[11995]: 7245441DF1: to=<user@smtp.tr-dub02.tr.com>, relay=mysmtp.com, delay=0.02, delays=0/0/0/0.02, dsn=2.0.0, status=sent (delivered to file: /dev/null)

Текущий и требуемый выход:

$ awk '/status=sent/{print $1,$2,$7,$8|"sort -u"}' /tmp/test |sed 's/to=<//g' | sed 's/>,//g' | grep -v "relay=local"
Mar 15 user@smtp.tr-dub02.tr.com relay=mysmtp.com,
Mar 7 testUser@example.com orig_nxp41641@smtp.rawat.example.com

1 Ответ

1 голос
/ 21 марта 2020

Это один из способов сделать это:

$ awk '
$12=="status=sent" && $8!="relay=local," {  # process only matching records
    gsub(/^to=<|>,$/,"",$7)                 # tune that $7
    b=$1 OFS $2 OFS $7 OFS $8               # buffer output record for
    if(!a[b]++)                             # ... uniq record 
        print b                             # ... output
}' file

Вывод с данными образца:

Mar 15 user@smtp.tr-dub02.tr.com relay=mysmtp.com,

Обновлен с версией для одной строки:

$ awk '$12=="status=sent"&&$8!="relay=local,"{gsub(/^to=<|>,$/,"",$7);b=$1 OFS $2 OFS $7 OFS $8;if(!a[b]++)print b}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...