2017-08-25 110 views
0

的淨你好最好的大師,PowerShell的提取多行

我有了成千上萬的二進制證書的文本文件中多次出現,這是它的一個樣本。

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 

我需要輸出每個證書到一個單獨的文件。我正在努力的是如何從「----- BEGIN CERTIFICATE -----」一路提取到第一個「----- END CERTIFICATE -----」以將其保存爲變量/文件,然後去找到下一個匹配等等。

每場比賽的輸出應該是這樣的:

我已經試過多個正則表達式的,沒有運氣:

有沒有一種方法,正則表達式或String.Split是否可以做到這一點匹配/分?

謝謝

+0

他們全部相同長度的這樣呢?行/二進制頭5行一行? – TheIncorrigible1

+0

你想如何命名單個文件?行號?遞增數量? – LotPings

回答

2

如果內容完全一樣,你說之上那麼這應該對提取的重點工作。

$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'我覺得自己犯了罪。 – TheIncorrigible1

1

這可能有幾種方法。例如,PowerShell 5具有可用於檢測模式的新功能。任何可能的正則表達式,儘管它總是有點神祕。如果你想要做的好又易於閱讀/理解劇本,你可以做這樣的事情:

$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 

隨着你上面給出的文件樣本,您將獲得3項證書並遵循輸出:

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

這個腳本會讀取文件sample.pem每發現證書遞增號碼保存到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) 
     }