Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PowerShell从CSV文件中提取数据_Powershell_Csv_Parsing_Firewall - Fatal编程技术网

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

使用PowerShell从CSV文件中提取数据,powershell,csv,parsing,firewall,Powershell,Csv,Parsing,Firewall,我有一个syslog服务器将来自防火墙设备的日志转储到CSV文件。我正在获取csv文件,并希望从日志中提取某些数据,如源和目标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

我有一个syslog服务器将来自防火墙设备的日志转储到CSV文件。我正在获取csv文件,并希望从日志中提取某些数据,如源和目标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\u name=“XG”device\u id=00000000000000 log\u id=010101600001 log\u type=“防火墙”log\u component=“防火墙规则”log\u subtype=“允许”status=“允许”优先级=信息持续时间=11 fw\u规则\u id=3策略\u type=3 user\u name=“”用户\u gp”iap=0 ips\U policy\u id=0 appfilter\u policy\u id=0 application=“安全套接字层协议”application\u risk=1 application\u technology=“网络协议”application\u category=“Infrastructure”in\u interface=“Port2”out\u interface=“Port1”src_mac=00:0:00:0:00:0 src_ip=75.148.000.000 src_country_code=USA dst_ip=23.24.000.000 dst_country_code=USA protocol=“TCP”src_port=55000 dst port=443 sent_pkts=7 recv_pkts=6 sent_字节=1369 recv_字节=918 tran_src_ip=192.168.000.000 tran_src_port=0 tran_Trans=168.000=“src=192.000.000”本地区dstzone=“LOCAL”dir_disp=”“connevent=“Stop”connid=“1782869248”vconnid=”“hb_health=“无心跳”消息=”“appresolvedby=“签名”

我已经能够编写一个脚本,可以从整个CSV文件中提取IP地址,但它没有指定是src_IP还是dst_IP等。我希望能够创建一个脚本,从CSV文件中获取数据,然后创建一个新的CSV文件,其中包含src_IP、dest_IP等列

我的代码如下:

$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
通过LotPings编辑

上述更新输入的示例输出(在
导出Csv
调用之前):


要按名称提取可指定的属性集

# 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

请注意,这首先创建一个包含所有输入属性的对象,然后通过
选择对象
仅选择感兴趣的对象,这有点低效,但使命令在概念上保持简单,并允许您轻松确定提取顺序。

文件就是这样显示的吗?这不是真正的csv。它有4列,没有标题,最后一列包含换行符。我在文章中添加了空格,以便将它们格式化为代码,但我现在可以看到它把事情搞砸了。我将编辑OP,这样它就不会包含我的示例输入文件的空格。太棒了!有没有一种方法可以进一步解析它,将所有信息提取到其他列中?比如拿出国家代码、srzzone、dstzone等等@FrameWorkTeam:很高兴听到这个消息;至于拉出其他字段:请查看我的更新。
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