2014-05-23 31 views
1

我想将下列行分割为对象。 该行来自我们的Exchange Incomming SMTP日志文件。正则表达式:其他进程的筛选字符串

2014-05-23T08:38:58.869Z,Exchangeserver\External Relay,08D1437A9AEFF27B,5,192.168.100.211:25,192.168.100.211:46964,<,MAIL FROM: <[email protected]> 

是否可以使用正则表达式来做到这一点?

所需的输出:

Time: 08:38:58 
Connector: Exchangeserver\External Relay 
ExchangeID:08D1437A9AEFF27B 
MailFrom:[email protected] 

我很抱歉,不过正则表达式是沉重了我的大脑.. :(

非常感谢

回答

2

你只需要的正则表达式!电子邮件地址,您可以拆分列,以及,-split :)

$arr = @("2014-05-23T08:38:58.869Z,Exchangeserver\External Relay,08D1437A9AEFF27B,5,192.168.100.211:25,192.168.100.211:46964,<,MAIL FROM: <[email protected]> " -split ",") 

$ht = [ordered]@{} 
$ht["Time"] = $arr[0] 
$ht["Connector"] = $arr[1] 
$ht["ExchangeID"] = $arr[2] 
$ht["MailFrom"] = $($arr[7] -match "([^[email protected]][email protected][^>]+)" | Out-Null; $matches[1]) 

$ht 

然后,您可以从哈希表格式化结果以获得所需的输出。

+0

好..我会用-split在更多的内容!但Exchange 2010与PowerShell V3不兼容,因此[ordered]不可用。不知道是否有必要,但第二行(日期时间)不适用于我们的2008R2服务器。在Windows 8.0上它可以工作,但输出是:名称值 ---- ----- 时间12:00:00 – Daniel4711

+0

@ Daniel4711有人编辑我的答案,我没有施放时间。如果你想提取时间,找到适当的格式化字符串,或只是使用正则表达式。从[有序]开始:没有必要。哈希表不能保证项目的保留顺序,但这不是问题,无论如何,您可能会通过键明确引用值。 –

2
$line = 
'2014-05-23T08:38:58.869Z,Exchangeserver\External Relay,08D1437A9AEFF27B,5,192.168.100.211:25,192.168.100.211:46964,<,MAIL FROM: <[email protected]>' 

$regex = '^[0-9-]+T([0-9:]+).+?,(.+?),(.+?),.+?MAIL FROM: <.*?(\[email protected]\w+?\.\w+)>' 

$line | 
New-PSObjectFromMatches -pattern $regex -Property $null,Time,Connector,ExchangeID,MailFrom | 
format-list 


Time  : 08:38:58 
Connector : Exchangeserver\External Relay 
ExchangeID : 08D1437A9AEFF27B 
MailFrom : [email protected] 

你可以得到新PSObjectFromMatches功能在这里:

http://gallery.technet.microsoft.com/scriptcenter/New-PSObjectFromMatches-87d8ce87

+0

+1大功能!您需要时总是重新创建这些代码块中的一个,但永远不要记住保存。最后得到它保存:D –

+1

谢谢(尝试-debug)! – mjolinor

+0

感谢提示,但修改$正则表达式是困难的东西。 - 分割不是如此强大,但易于使用! – Daniel4711

相关问题