2017-08-25 7 views
0

Bonjour meilleurs gourous sur le net,Powershell extrait occurences multiples dans plusieurs lignes

Je dispose d'un fichier texte qui contient des milliers de certificats binaires, c'est un échantillon de celui-ci.

Row 1: 
    Binary Certificate: 
-----BEGIN CERTIFICATE----- 
MIIFtzCCBJ+gAwIBAgIKGUNYAwAAAAAAODANBgkqhkiG9w0BAQsFADBxMQswCQYD 
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME 
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT 
-----END CERTIFICATE----- 


Row 2: 
    Binary Certificate: 
-----BEGIN CERTIFICATE----- 
MIIGEzCCBPugAwIBAgIKGVe6uwAAAAAAOTANBgkqhkiG9w0BAQsFADBxMQswCQYD 
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME 
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT 
-----END CERTIFICATE----- 


Row 3: 
    Binary Certificate: 
-----BEGIN CERTIFICATE----- 
MIIGMzCCBRugAwIBAgIKGYrkyAAAAAAAOjANBgkqhkiG9w0BAQsFADBxMQswCQYD 
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME 
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT 
-----END CERTIFICATE 

Je dois exporter chaque certificat dans un fichier distinct. Ce que je lutte avec est comment extraire de "----- BEGIN CERTIFICATE -----" tout le chemin à la première "----- END CERTIFICATE -----" pour l'enregistrer dans un variable/fichier, puis allez et trouvez la correspondance suivante et ainsi de suite.

La sortie de chaque match devrait ressembler à ceci:

J'ai essayé plusieurs Regex de pas de chance: [

Est-il possible, que ce soit Regex ou String.Split qui peuvent le faire match/split?

Merci

+0

sont-ils tous la même longueur comme ça? 5 lignes une pièce avec l'en-tête Row/Binary? – TheIncorrigible1

+0

Comment voulez-vous nommer les fichiers uniques? Numéro de ligne? Incrémentation du nombre? – LotPings

Répondre

2

Si le contenu est exactement comme vous l'avez dit ci-dessus cela devrait fonctionner sur l'extraction de la clé.

$File = "C:\Test.txt" 
$content = Get-Content $file 
$contents = $content 

$Complete = [regex]::split($contents, "BEGIN CERTIFICATE-----(.*?)-----END CERTIFICATE") 

for($i = 1; $i -lt $Complete.Length; $i =$i+2){ 
    $Complete[$i] -replace " ","`r`n" 
} 
+0

> '$ i = 1' J'ai l'impression qu'un péché a été commis. – TheIncorrigible1

1

Il peut y avoir plusieurs façons de procéder. PowerShell 5 a une nouvelle fonctionnalité qui peut être utilisée pour détecter des motifs, par exemple. Tout est possible avec regex, même si c'est toujours un peu énigmatique. Si vous voulez faire le bon vieux facile à lire/comprendre script, vous pouvez faire quelque chose comme ceci:

Avec l'échantillon de fichier
$begin_certificate='-----BEGIN CERTIFICATE' 
$end_certificate ='-----END CERTIFICATE' 

[System.Collections.ArrayList][email protected]() 

$add_next = $false 

$all_certs = get-content C:\Temp\a.txt 

Foreach ($line in $all_certs) { 


    if ($line.StartsWith($begin_certificate)) { 
     $add_next = $true 
     $cert_content = $begin_certificate 
     continue 
    } 

    if ($add_next) {  
     $cert_content += "`n$line"    

     if ($line.StartsWith($end_certificate)) { 
      $add_next = $false    
      [void]$certs.add($cert_content) # don't print the result of operation   
     } 
    } 
} 
# This array list has all the certs now 
$certs 

vous avez donné ci-dessus, vous obtiendrez 3 articles en certs et après en sortie:

-----BEGIN CERTIFICATE 
MIIFtzCCBJ+gAwIBAgIKGUNYAwAAAAAAODANBgkqhkiG9w0BAQsFADBxMQswCQYD 
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME 
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE 
MIIGEzCCBPugAwIBAgIKGVe6uwAAAAAAOTANBgkqhkiG9w0BAQsFADBxMQswCQYD 
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME 
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE 
MIIGMzCCBRugAwIBAgIKGYrkyAAAAAAAOjANBgkqhkiG9w0BAQsFADBxMQswCQYD 
VQQGEwJERTEcMBoGA1UECBMTTm9yZHJoZWluLVdlc3RmYWxlbjENMAsGA1UEBxME 
Qm9ubjEWMBQGA1UEChMNRGV1dHNjaGUgUG9zdDEdMBsGA1UEAxMURFBESEwgVExT 
-----END CERTIFICATE 
0

Ce script lire le fichier sample.pem et enregistrer chaque certificat trouvé incrémenter le numéro cert#.pem

## Q:\Test\2017\08\25\SO_45884754.ps1 

$Pattern = '(?smi)^-{2,}BEGIN CERTIFICATE-{2,}.*?-{2,}END CERTIFICATE-{2,}' 
Get-Content .\sample.PEM -raw | 
    Select-String -Pattern $Pattern -Allmatches| 
     ForEach-Object {$Cnt=0;$_.Matches}| ForEach-Object { 
      $Cnt++ 
      Set-Content -Value $_.Value -Path ("Cert{0}.pem" -f $Cnt) 
     }