Извлечение данных из файлов CSV с помощью PowerShell - PullRequest
0 голосов
/ 02 июля 2018

У меня есть сервер системного журнала, выгружающий журналы с нашего устройства брандмауэра в файлы 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, устройство = "SFW" дата = 2018-07-01 время = 14: 48: 39 часовой пояс = "PDT" имя_устройства = "XG "device_id = 00000000000000 log_id = 010101600001 log_type =" Межсетевой экран "log_component =" Правило межсетевого экрана "log_subtype =" Разрешено "status =" Разрешить "приоритет = длительность информации = 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 sent_pkts = 7 recv_pkts = 6 sent_bytes = 1369 recv_bytes = 968__t_t_t_t_1_t_t_____________c_2_2 = 0 = 0__t_t = 0 = 192.168.000.000 tran_dst_port = 0 srczonetype = "WAN" srczone = "WAN" dstzonetype = "LOCAL" dstzone = "LOCAL" dir_disp = "" connevent = "Stop" connid = "1782869248" vconnid = "" hb_ health = "No Heartbeat" message = "" appresolvedby = "Подпись"

Мне удалось написать скрипт, который может извлекать IP-адреса из всего файла CSV, но он не указывает, является ли это 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

1 Ответ

0 голосов
/ 02 июля 2018
$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

Для извлечения заданного набора свойств по name :

# 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 свойствами ввода и , а затем выбирает только те, которые представляют интерес, с помощью Select-Object, что несколько неэффективно, но сохраняет команду концептуально простой и позволяет легко определить извлечение заказа .

...