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

时间:2018-07-01 23:06:01

标签: powershell csv parsing firewall

我有一个系统日志服务器,将日志从防火墙设备转储到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 = 010101600001 log_type =” Firewall“ log_component =” Firewall Rule“ log_subtype =” Allowed“ status =” Allow“优先级=信息持续时间= 11 fw_rule_id = 3 policy_type = 3 user_name =”“ user_gp =”“ iap = 0 ips_policy_id = 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 = 1ip recv_bytes = 918 tran_src_0.000 = 192.168.000.000 tran_dst_port = 0 srczonetype =“ WAN” srczone =“ WAN” dstzonetype =“ LOCAL” dstzone =“ LOCAL” dir_disp =“” connevent =“ Stop” connid =“ 1782869248” vconnid =“” hb_hea lth =“没有心跳”消息=“” 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

1 个答案:

答案 0 :(得分:1)

$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

请注意,这首先创建一个具有 all 输入属性的对象,然后 then 通过Select-Object仅选择感兴趣的对象,虽然效率不高,但保持命令在概念上很简单,使您可以轻松确定提取 order