我有一个系统日志服务器,将日志从防火墙设备转储到CSV文件。我正在获取该csv文件,并希望在日志中提取某些数据,例如源IP地址和目标IP地址,以便以后可以对它们进行进一步的分析。
这是源文件中单个记录的示例。请注意,数据中包含的IP地址如何以“ src_ip”,“ dst_ip”,“ tran_src_ip”或“ tran_dest_ip”作为前缀。注意:我已经编辑了IP地址以屏蔽它们。
2018-07-01 14:48:47,Local7.Info,192.168.1.00,device =“ SFW” date = 2018-07-01 time = 14:48:39 timezone =“ PDT” device_name =“ XG” device_id = 00000000000000 log_id = 0.010 0 appfilter_policy_id = 0 application =“安全套接字层协议” application_risk = 1 application_technology =“网络协议” application_category =“基础结构” in_interface =“ Port2” out_interface =“ Port1” src_mac = 00:0:00:0:00:0 src_ip = 75.148.000.000 src_country_code =美国dst_ip = 23.24.000.000 dst_country_code =美国协议=“ TCP”src_port = 55000 dst_port = 443 send_pkts = 7 recv_pkts = 6 send_bytes = 1369 recv_bytes = 918 tran_src_ip = 192.168.000.000 tran_src_port = 0 tran_dst_ip = 192.168.000.000 tran_dst_port = 0 srczonetype =“ WAN” srczone =“ =” WAN“ d =“ LOCAL” dir_disp =“” connevent =“停止” connid =“ 1782869248” vconnid =“” hb_health =“无心跳” message =“” appresolvedby =“签名”没有心跳“消息=” =“ appresolvedby =”签名“没有心跳“消息=” =“ appresolvedby =”签名“
我已经能够编写一个可以将IP地址从整个CSV文件中拉出的脚本,但是它没有指定是src_ip还是dst_ip等。我希望能够创建一个可以CSV文件中的数据,然后使用包含src_ip,dest_ip等的列创建一个新的CSV文件。
我的代码如下:
$input_path = ‘c:\powershell_work\data.csv’
$output_file = ‘c:\powershell_work\output-file.csv’
$regex = ‘\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b’
$ipaddresses = select-string -Path $input_path -Pattern $regex -AllMatches |
% { $_.Matches } | % { $_.Value } | out-file $output_file -append
$regex = '\b(\w+)=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b)'
Select-String -LiteralPath $input_path -AllMatches -Pattern $regex | ForEach-Object {
$obj = New-Object pscustomobject
foreach ($match in $_.Matches) {
Add-Member -InputObject $obj -NotePropertyName $match.Groups[1].Value -NotePropertyValue $match.Groups[2].Value
}
$obj
} | Export-Csv -NoTypeInformation $output_file
由LotPings编辑
您上面更新的输入的示例输出(在Export-Csv
调用之前):
src_ip dst_ip tran_src_ip tran_dst_ip
------ ------ ----------- -----------
75.148.000.000 23.24.000.000 192.168.000.000 192.168.000.000
要通过名称提取一组指定的属性:
# Use a regex that matches all key-value pairs.
$regex = '\b(\w+)=([^ ]+)'
Select-String -LiteralPath $input_path -AllMatches -Pattern $regex | ForEach-Object {
$obj = New-Object pscustomobject
foreach ($match in $_.Matches) {
Add-Member -InputObject $obj -NotePropertyName $match.Groups[1].Value -NotePropertyValue $match.Groups[2].Value
}
$obj
} | Select-Object *_ip, srczone, src_country_code, dstzone, dst_country_code |
Export-Csv -NoTypeInformation $output_file
请注意,这首先创建了一个具有所有输入属性的对象,然后仅通过选择了感兴趣的那些,Select-Object
虽然效率低下,但在概念上使命令保持简单,并允许您轻松确定提取顺序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句