使用PowerShell从CSV文件中提取数据

框架团队

我有一个系统日志服务器,将日志从防火墙设备转储到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
mklement0
$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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章