2017-10-01 15 views
1

私は、複数行のログファイルをCSV形式に変換しようとしていますが、何も動作しません。助けてください!私はWindowsサーバー上にあるので、コマンドラインまたはPowershellでなければなりません。Windows cmdまたはPowershellで複数行のテキストログをCSVに変換する

入力サンプル:必要

SERVICE_NAME: BDESVC 
DISPLAY_NAME: BitLocker Drive Encryption Service 
BDESVC hosts the BitLocker Drive Encryption service. BitLocker Drive Encryption provides secure startup for the operating system, as well as full volume encryption for OS, fixed or removable volumes. This service allows BitLocker to prompt users for various actions related to their volumes when mounted, and unlocks volumes automatically without user interaction. Additionally, it stores recovery information to Active Directory, if available, and, if necessary, ensures the most recent recovery certificates are used. Stopping or disabling the service would prevent users from leveraging this functionality. 
    TYPE   : 20 WIN32_SHARE_PROCESS 
    START_TYPE : 3 DEMAND_START 
    ERROR_CONTROL  : 1 NORMAL 
    BINARY_PATH_NAME : C:\WINDOWS\System32\svchost.exe -k netsvcs 
    LOAD_ORDER_GROUP : 
    TAG  : 0 
    DEPENDENCIES  : 
    SERVICE_START_NAME: localSystem 
    FAIL_RESET_PERIOD : 900 seconds 
    FAILURE_ACTIONS : Restart DELAY: 60000 seconds 
       : Restart DELAY: 60000 seconds 
       : None DELAY: 0 seconds 

SERVICE_NAME: BFE 
DISPLAY_NAME: Base Filtering Engine 
The Base Filtering Engine (BFE) is a service that manages firewall and Internet Protocol security (IPsec) policies and implements user mode filtering. Stopping or disabling the BFE service will significantly reduce the security of the system. It will also result in unpredictable behavior in IPsec management and firewall applications. 
    TYPE   : 20 WIN32_SHARE_PROCESS 
    START_TYPE : 2 AUTO_START 
    ERROR_CONTROL  : 1 NORMAL 
    BINARY_PATH_NAME : C:\WINDOWS\system32\svchost.exe -k LocalServiceNoNetwork 
    LOAD_ORDER_GROUP : NetworkProvider 
    TAG  : 0 
    DEPENDENCIES  : RpcSs 
    SERVICE_START_NAME: NT AUTHORITY\LocalService 
    FAIL_RESET_PERIOD : 86400 seconds 
    FAILURE_ACTIONS : Restart DELAY: 120000 seconds 
       : Restart DELAY: 300000 seconds 
       : None DELAY: 0 seconds 

CSV出力(最初のイベントのみを示す):

SERVICE_NAME,DISPLAY_NAME,DESCRIPTION,TYPE,START_TYPE,ERROR_CONTROL,BINARY_PATH_NAME,LOAD_ORDER_GROUP,TAG,DEPENDENCIES,SERVICE_START_NAME,FAIL_RESET_PERIOD,FAILURE_ACTIONS_1,FAILURE_ACTIONS_2,FAILURE_ACTIONS_3, 
BDESVC,BitLocker Drive Encryption Service,"BDESVC hosts the BitLocker Drive Encryption service. BitLocker Drive Encryption provides secure startup for the operating system, as well as full volume encryption for OS, fixed or removable volumes. This service allows BitLocker to prompt users for various actions related to their volumes when mounted, and unlocks volumes automatically without user interaction. Additionally, it stores recovery information to Active Directory, if available, and, if necessary, ensures the most recent recovery certificates are used. Stopping or disabling the service would prevent users from leveraging this functionality.",20 WIN32_SHARE_PROCESS,3 DEMAND_START,1 NORMAL,C:\WINDOWS\System32\svchost.exe -k netsvcs,,0,,localSystem,900 seconds,Restart DELAY: 60000 seconds,Restart DELAY: 60000 seconds,None DELAY: 0 seconds, 
+0

にエクスポートしたいすべてのプロパティを追加してくださいSOへようこそ!あなたのためのスクリプトを書くことができる多くのSOユーザがいる一方、SOはコード作成サービスではなく、質問/回答フォーラムです。試してみて、コードを投稿して、うまくいかないことについて具体的な質問をする必要があります。 – DSway

+0

^^これは非常に真実であり、将来的には念頭に置く価値があります。私は答えましたが、ほとんどの場合、これらの挑戦は常に私の好奇心を刺激するからです。それが役に立てば幸い。 –

答えて

0

Mark Wraggは異なる視点を提供するために、あなたはむしろ、それはこれらの2つの特定の例のためであるとまったく同じ形式オフ作業よりも、あなたが出力に必要な変数をキャプチャするSelect-Stringを使用して試すことができます。これはSERVICE_NAMEは各エントリを開始しますという仮定に基づいて、すべての個々のログエントリの配列を返します

$myArr = [IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=SERVICE_NAME)" -AllMatches | % {$_.Matches} | % {$_.Value} 

あなたはこのような何かを試すことができます。

$myArr = @() 
[IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=(SERVICE_NAME)|($))" -AllMatches | % {$_.Matches} | % {$_.Value} | % { $myArr += ` 
    [PSCustomObject]@{ 
     "Type" = Select-String -InputObject $_ -Pattern "(?<=TYPE   :).*?(?=\r)" | % {$_.Matches} | % {$_.Value}; 
     "START_TYPE" = Select-String -InputObject $_ -Pattern "(?<=START_TYPE :).*?(?=\r)" | % {$_.Matches} | % {$_.Value}; 
    }} 
あなたが希望としてあなたはそのハッシュテーブルにできるだけ多くのプロパティを追加することができます

(ERROR_CONTROL:そこから、あなたはその配列内の各エントリをループし、値を探し、あなたはCSVに出力したいことができます、SERVICE_START_NAMEなど)、 `Export-CSV 'を使ってファイルに書き出します。このソリューションに基づいて、あなたはそれを扱うことができる2つの方法があります:

$myArr | Select-Object Type,Start_Type | Export-CSV 'out.csv' -NoTypeInformation 

たり、変数にそれを読むことを気にしない場合は、パイプの端にこれを追加します。

[IO.File]::ReadAllText("C:\YourLogFile.txt") | Select-String -Pattern "SERVICE_NAME[\s\S]*?(?=(SERVICE_NAME)|($))" -AllMatches | % {$_.Matches} | % {$_.Value} | % { ` 
    @([PSCustomObject]@{ 
     "Type" = Select-String -InputObject $_ -Pattern "(?<=TYPE   :).*?(?=\r)" | % {$_.Matches} | % {$_.Value}; 
     "START_TYPE" = Select-String -InputObject $_ -Pattern "(?<=START_TYPE :).*?(?=\r)" | % {$_.Matches} | % {$_.Value}; 
    })} | Select-Object -Property Type,Start_Type | Export-Csv -Path C:\temp\test\myout.txt -NoTypeInformation 

はちょうどあなたがSelect-Object

+0

最終回答は:(ありがとう!)それは完全に働いた。 – potap75

0

ここで可能な解決策があります。これはあなたのデータに関するいくつかの仮定を行い、この種のものをやって、常に少しハックであるに注意してください:

(Get-Content 'YourFile.log') -Replace '(.*?)\s*:\s*(.*)','$1=$2' -Split '\r\n\r\n' | ForEach-Object { 
    $Text = ($_ -split '\n') -Replace '\\','\\' 
    $Text[2] = 'DESCRIPTION='+ $Text[2] 
    $Result = $Text | Out-String | ConvertFrom-StringData 
    $Properties = [ordered]@{} 

    $Headers = 'SERVICE_NAME','DISPLAY_NAME','DESCRIPTION','TYPE','START_TYPE','ERROR_CONTROL','BINARY_PATH_NAME','LOAD_ORDER_GROUP','TAG','DEPENDENCIES','SERVICE_START_NAME','FAIL_RESET_PERIOD','FAILURE_ACTIONS' 
    $Headers | ForEach-Object { $Properties.Add($_,$Result.$_) } 
    [PSCustomObject]$Properties 

} | Export-CSV 'out.csv' -NoTypeInformation 
  • はへの:最初と任意の空白文字側のいずれかを変換するための正規表現(.*?)\s*:\s*(.*)を使用します=。これにより、後でConvertFrom-StringDataコマンドレットを使用してデータをハッシュテーブルオブジェクトに変換できます。
  • 2つの(Windowsスタイルの)改行がある場所に基づいてデータを分割します。したがって、個々のレコードのコレクションがあります。
  • 各レコードを繰り返し、各行にテキストを分割します。正規表現'\\','\\'を使用して、スラッシュを2つのスラッシュに置き換えます。これは、ConvertFrom-StringDataがファイルパスによってトリップされないようにするためです。
  • データの3行目をとり、この行の先頭に 'DESCRIPTION ='を追加します。そうしないと、この行は予想されるname = value形式になりません。
  • 結果のテキストをOut-Stringで単一の文字列オブジェクトに返してから、これをConvertFrom-StringDataでハッシュテーブルに変換します。
  • ConvertFrom-StringDataはフィールドをアルファベット順に並べ替えたので、$Propertiesという名前の第2の[ordered]ハッシュテーブルを作成し、ヘッダの定義済みの順序付きリストを使用して、これからPowerShellオブジェクトを作成します。
  • 結果をCSVにエクスポートします。
+0

私はたくさんのスクリプトを試していますが、それらはすべて失敗しました。私は何かについて尋ねるときに私がそれらを投稿することを確認します。ありがとうございました!うわー、それは私が期待していたよりもずっと長いです... – potap75

+0

はエラーをスローします:インデックスは配列の境界外でした。ラインで :3チャー:5 + $テキスト[2] = 'DESCRIPTION =' + $テキスト[2] + ~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ + CategoryInfo:OperationStopped:(:) []、IndexOutOfRangeException + FullyQualifiedErrorId:System.IndexOutOfRangeException – potap75

+0

出力ファイル: "SERVICE_NAME"、 "DISPLAY_NAME"、 "DESCRIPTION"、」 TYPE」、 "START_TYPE"、 "ERROR_CONTROL"、 "BINARY_PATH_NAME"、 "LOAD_ORDER_GROUP"、 "TAG"、 "依存性"、 "SERVICE_START_NAME"、 "FAIL_RESET_PERIOD"、 "FAILURE_ACTIONS" ,,,,,,,,,,, 、 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,, ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,, ,,,,,,,,,,, ,,,,,,,,,, – potap75

関連する問題