bugfix> powershell > 投稿

ファイアウォールアプライアンスからCSVファイルにログをダンプするsyslogサーバーがあります。私はその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" priority=Information duration=11 fw_rule_id=3 policy_type=3 user_name="" user_gp="" iap=0 ips_policy_id=0 appfilter_policy_id=0 application="Secure Socket Layer Protocol" application_risk=1 application_technology="Network Protocol" application_category="Infrastructure" in_interface="Port2" out_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_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="Signature"

CSVファイル全体からIPアドレスを取得できるスクリプトを作成できましたが、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 件
  • $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 経由で関心のあるもののみを選択します 、やや非効率的ですが、コマンドを概念的にシンプルに保ち、抽出を簡単に決定できます注文

あなたの答え