Linux 如何在awk中与其他模式一起使用反转匹配

Linux 如何在awk中与其他模式一起使用反转匹配,linux,awk,sed,Linux,Awk,Sed,如何使用倒置匹配与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" $awk'/status=sent/{print$1、$2、$7、$8

如何使用倒置匹配与
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"
$awk'/status=sent/{print$1、$2、$7、$8 |“sort-u”}/var/log/maillog-20150308 | sed's/to=,//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)
2009年3月15日09:00:12测试主机后缀/本地[11995]:7245441DF1:to=,中继=本地,延迟=0.02,延迟=0/0/0/0.02,dsn=2.0.0,状态=已发送(发送到文件:/dev/null) 3月15日09:00:12测试主机后缀/本地[11995]:7245441DF1:to=,relay=mysmtp.com,delay=0.02,delays=0/0/0/0.02,dsn=2.0.0,status=sent(传递到文件:/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
$awk'/status=sent/{print$1、$2、$7、$8 |“sort-u”}/tmp/test | sed's/to=,//g'| grep-v“relay=local”
3月15日user@smtp.tr-dub02.tr.com relay=mysmtp.com,
3月7日testUser@example.com原_nxp41641@smtp.rawat.example.com

这是一种方法:

$ 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
更新为单行程序版本:

$ awk '$12=="status=sent"&&$8!="relay=local,"{gsub(/^to=<|>,$/,"",$7);b=$1 OFS $2 OFS $7 OFS $8;if(!a[b]++)print b}' file
$awk'$12==“状态=已发送”&&8=“relay=local,{gsub(/^to=,$/,”“,$7);b=$1 OFS$2 OFS$7 OFS$8;如果(!a[b]+)打印b}”文件

这是一种方法:

$ 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
更新为单行程序版本:

$ awk '$12=="status=sent"&&$8!="relay=local,"{gsub(/^to=<|>,$/,"",$7);b=$1 OFS $2 OFS $7 OFS $8;if(!a[b]++)print b}' file
$awk'$12==“状态=已发送”&&8=“relay=local,{gsub(/^to=,$/,”“,$7);b=$1 OFS$2 OFS$7 OFS$8;如果(!a[b]+)打印b}”文件

请将示例输入(无描述、无图像、无链接)和您对该示例输入的期望输出添加到您的问题中(无评论)。@Cyrus,用示例和期望更新了帖子,这方面的访问量很大。请添加示例输入(无描述、无图像、无链接)还有你的问题输入样本的期望输出(无评论)。@Cyrus,用样本和期望更新了帖子,谢谢你访问了很多。谢谢@James,可以转换成一行吗。谢谢@James,可以转换成一行吗。