Добавление столбца в CSV с использованием данных, возвращаемых из функции - PullRequest
0 голосов
/ 04 июля 2018

Я работал над сценарием, который принимает выходные данные с сервера системного журнала, содержащего журналы брандмауэра, реорганизует эти выходные данные в новый файл CSV в более удобочитаемом формате, а затем выполняет поиск по исходным IP-адресам для идентификации откуда происходит городской трафик. Я не уверен, как получить результаты от моей функции, которая ищет подробности об IP-адресах, чтобы добавить дополнительные столбцы в новый файл CSV.

Это пример отдельной записи из исходного файла. Примечание. Я отредактировал IP-адреса, чтобы замаскировать их.

2018-07-01 14: 48: 47, Local7.Info, 192.168.1.00, device = "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 = 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" dstzonetype = "LOCAL" dstzone = "LOCAL" dir_disp = "" connevent = "Stop" connid = "1782869248" vconnid = "" hb_health = "No Heartbeat" message = "" appresolvedby = "Подпись"

С помощью других пользователей я смог написать скрипт, который создает новый CSV-файл ( $ output_file ) в более удобном для читателя формате и ищет информацию о столбец src_ip . Я не уверен, как я могу взять результаты этой функции ( Get-IPGeolocation ) и добавить дополнительные столбцы в мой $ output_file с результатами.

#Parameters for environment
$regex = '\b(\w+)=([^ ]+)'
$input_path = "C:\powershell_work\ParsingSophos\data.csv"
$output_file = "C:\powershell_work\GeolocatingIPs\combine-output.csv"


#Function used to lookup IP-Address information.
function Get-IPGeolocation
{
    Param
    (
        [string]$IPAddress
    )

    $request = Invoke-RestMethod -Method Get -Uri "http://geoip.nekudo.com/api/$IPAddress"

    [PSCustomObject]@{
        IP        = $request.IP
        City      = $request.City
        Country   = $request.Country.Name
        Code      = $request.Country.Code
        Location  = $request.Location.Latitude
        Longitude = $request.Location.Longitude
        TimeZone  = $request.Location.Time_zone
    }
}

# Parsing the input_path file, and exporting to a more workable format
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


# Gathering list of Source IPs to be used in the lookup
$src_ips = Import-CSV $output_file | select -ExpandProperty src_ip


# Loop that runs each IP through the function to find IP address information
ForEach($ip in $src_ips) {
Get-IPGeolocation -IPAddress $ip
}

Запуск этого сценария с несколькими записями данных в вашем $ input_path CSV-файле возвращает результаты, подобные этим. Выходной пример

1 Ответ

0 голосов
/ 04 июля 2018

По сути, вы спрашиваете , как объединить два пользовательских объекта :

Простой пример (синтаксис PSv4 +, предполагает, что наборы имен свойств не перекрываются):

# Create two sample custom objects to merge.
$co1 = [pscustomobject] @{ one = 1; two = 2; three = 3 }
$co2 = [pscustomobject] @{ four = 4; five = 5; six = 6 }

# Add $co2's properties to $co1
$co2.psobject.properties.foreach({
  Add-Member -InputObject $co1 -NotePropertyName $_.Name -NotePropertyValue $_.Value
})

# Output $co1, which now contains its own properties plus the ones from $co2.
$co1

Вышеуказанные выходы:

one   : 1
two   : 2
three : 3
four  : 4
five  : 5
six   : 6

Применительно к вашему сценарию:

Import-Csv $output_file | ForEach-Object {
  $obj = $_
  (Get-IPGeolocation -IPAddress $obj.src_ip).psobject.properties.foreach({
    Add-Member -InputObject $obj -NotePropertyName $_.Name -NotePropertyValue $_.Value
  })
  $obj
} | Export-Csv -NoTypeInformation .\merged.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...