2017-10-01 4 views
1

Je suis en train de convertir un fichier journal multiligne uniforme en un fichier CSV, et rien ne fonctionne. S'il vous plaît aider! Je suis sur un serveur Windows, il doit donc s'agir d'une ligne de commande ou d'un Powershell.convertir le journal de texte multiligne en CSV avec Windows cmd ou Powershell

échantillon d'entrée:

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 

sortie CSV nécessaire (affiché uniquement le premier événement):

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

Bienvenue sur SO! Bien qu'il existe de nombreux utilisateurs SO qui pourraient écrire un script pour vous, SO n'est pas un service d'écriture de code, mais un forum de questions/réponses. Vous devriez faire une tentative, poster votre code et poser des questions spécifiques sur ce qui ne fonctionne pas. – DSway

+0

^^ Ceci est très vrai et mérite d'être pris en compte à l'avenir. J'ai répondu mais surtout parce que ce genre de défis pique toujours ma curiosité. J'espère que cela aide. –

Répondre

0

Pour offrir une perspective différente de Mark Wragg, vous pouvez essayer d'utiliser Select-String pour capturer les variables dont vous avez besoin à la sortie, plutôt que de travailler hors format exactement comme pour ces deux cas particuliers.

Vous pouvez essayer quelque chose comme ceci:

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

Cela retourne un tableau de toutes les entrées individuelles du journal, basé sur l'hypothèse que SERVICE_NAME commence chaque entrée. De là, vous pouvez faire une boucle à travers chaque entrée dans ce tableau, et recherchez les valeurs que vous souhaitez sortie au format CSV:

$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}; 
    }} 

Vous pouvez ajouter autant de propriétés dans cette table de hachage que vous le souhaitez (ERROR_CONTROL , SERVICE_START_NAME, etc.), puis utilisez `Export-CSV 'pour les écrire dans un fichier.Il y a deux façons dont vous pouvez gérer que, sur la base de cette solution:

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

ou l'ajouter à la fin du tuyau, si vous ne se soucient pas de le lire dans une variable:

[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 

Assurez-vous simplement d'ajouter toutes les propriétés que vous souhaitez exporter vers Select-Object

+0

et la réponse finale est: (merci les gars!) Cela a totalement fonctionné. – potap75

0

est ici une solution possible. Gardez à l'esprit ce qui rend certaines hypothèses au sujet de vos données et de faire ce genre de chose est toujours un peu hacky:

(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 
  • Utilise un (.*?)\s*:\s*(.*) regex pour convertir le premier : et tout caractères espace de chaque côté de celui-ci à un =. Nous faisons cela afin que nous puissions utiliser la cmdlet ConvertFrom-StringData pour convertir les données en objet hashtable.
  • les données sont réparties en fonction de l'endroit où il y a deux chariot (style Windows) retourne \r\n\r\n donc nous avons une collection des dossiers individuels
  • fait passer dans les dossiers et divise le texte aux lignes individuelles. Remplace les barres obliques avec deux barres obliques à l'aide de l'expression rationnelle (qui prête à confusion) '\\','\\'. C'est ainsi que ConvertFrom-StringData n'est pas triplé par les chemins de fichier.
  • Prend la troisième ligne dans les données et ajoute 'DESCRIPTION =' au début de cette ligne, sinon cette ligne n'est pas au format attendu = valeur.
  • Renvoie le texte résultant à un objet chaîne unique via Out-String, puis le convertit en hashtable via ConvertFrom-StringData.
  • Parce que ConvertFrom-StringData réorganise les champs par ordre alphabétique, crée une deuxième table de hachage [ordered] nommée $Properties qui utilise une liste ordonnée prédéfinie des en-têtes, puis crée un objet PowerShell à partir de celui-ci.
  • Exporte le résultat au format CSV.
+0

J'ai essayé un tas de scripts mais ils ont tous échoué. Je ferai en sorte de les poster la prochaine fois que je poserai des questions sur quelque chose. Je vous remercie! Wow, c'est beaucoup plus long que ce à quoi je m'attendais ... – potap75

+0

renvoie une erreur: Index était en dehors des limites du tableau. À la ligne: 3 car: 5 + Texte $ [2] = 'DESCRIPTION =' + Texte $ [2] + ~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~ + CategoryInfo: OperationStopped: (:) [], IndexOutOfRangeException + FullyQualifiedErrorId: System.IndexOutOfRangeException – potap75

+0

Fichier de sortie: "SERVICE_NAME", "DISPLAY_NAME", "DESCRIPTION", " TYPE », "start_type", "ERROR_CONTROL", "BINARY_PATH_NAME", "LOAD_ORDER_GROUP", "TAG", "DEPENDANCES", "SERVICE_START_NAME", "FAIL_RESET_PERIOD", "FAILURE_ACTIONS" ,,,,,,,,,,, , ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,, ,,, ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,, ,, ,,,,,,,,,,, ,,,,,,,,,,, – potap75