如何使用awk从特定中继提取Postfix日志中的所有会话?

时间:2010-11-18 04:57:36

标签: regex awk postfix-mta

我正在尝试从后缀日志文件中的发送中继IP地址中提取发件人地址

任何想法???

非常感谢任何帮助

Nov 16 00:05:10 mailserver pfs/smtpd[4365]: 925D54E6D9B: client=client1[1.2.3.4]   
Nov 16 00:05:10 mailserver pfs/cleanup[4413]: 925D54E6D9B: message-id=<11414>    
Nov 16 00:05:10 mailserver pfs/qmgr[19118]: 925D54E6D9B: from=<11414@localhost>, size=40217, nrcpt=1 (queue active)    
Nov 16 00:05:10 mailserver pfs/smtp[4420]: 925D54E6D9B: to, relay=[1.3.5.7]:25, delay=0.02, delays=0.02/0/0/0, dsn=5.0.0, status=bounced (host [1.3.5.7] refused to talk to me: 550 Please remove this address from your list)   
Nov 16 00:05:10 mailserver pfs/bounce[4310]: 925D54E6D9B: sender non-delivery notification: 972E34E6D9F   
Nov 16 00:05:10 mailserver pfs/qmgr[19118]: 925D54E6D9B: removed

2 个答案:

答案 0 :(得分:0)

嗯,如果你只想用和中继字段收集显示bling,你可以使用它:

/: from=/ { lastFrom = $7 }
/relay=/ { print lastFrom, $8 }

如果你真的想要提取核心地址,它会变得稍微复杂......

/: from=/ { lastFrom = $7 }
/relay=/ {
  r = $8
  gsub(/from=</, "", lastFrom)
  gsub(/>,*/, "", lastFrom)
  gsub(/relay=\[/, "", r)
  gsub(/\].*/, "", r)
  print lastFrom, r
}

$ awk -f mail2.awk mail.dat
11414@localhost 1.3.5.7

像往常一样,这些解决方案同时适用于The One True Awk和gawk。

答案 1 :(得分:0)

$7 ~ /^from=,$/ {
    from[$6] = substr($7, 7, length($7) - 8)
} 
$8 ~ /^relay=\[/ { 
    if (substr($8, "[1.3.5.7]")) 
        print from[$6]
    delete from[$6]}
}

每次看到记录行时,都会将其保存在关联数组中, 由消息的队列ID索引。当看到中继线时,如果是的话 打印您对相关联的线路感兴趣的继电器。 substr()是 因此你不必使用\ _escape所有的元字符 - “[”,“]”,“。”。 无论是否是您感兴趣的继电器,都会清除来自数据的数据 向上,这样阵列就不会无限制地增长。