none
String nach einem bekanntem Wort und unbekannter Zahl durchsuchen RRS feed

  • Frage

  • Hallo zusammen,

    ich habe ein Problem mit meinem Powershellskript - Irgendwie bin ich nicht in der Lage aus einem String einen Text mit einer Zahl auszulesen.

    To: 2016-01-10 00:00:00 (Europe/Berlin)
     Count
    Allowed 2718
    Quarantined 486
    Replaced 19
    Action Count Count (%)
    Allowed 2718 84.33
    Quarantined 486 15.08
    Replaced 19 0.59
    Total: 3 3223

    Dieser Text oben steht in meiner Variable $Text. Ich möchte nun nach "Allowed" suchen, und mir dann die Zahl (in diesem Fall 2718) ausgeben lassen. Das Wort "Allowed" ist immer gleich, die Zahl nicht. Die Zahl kann 1,2,3,4 oder 5 stellig sein.

    Wenn ich " $text | select-string -pattern "Allowed" " eingebe wird mir der ganze Inhalt von $text ausgegeben, genau wie bei

    " $text | select-string -pattern "\bAllowed\b" -AllMatches  "

    Wie kann die gewünschten Infos aus meinem String rausbekommen? (Laut $text | get-member) habe ich einen System.String

    Vielen Dank für Denkanstöße





    Freitag, 22. Januar 2016 07:46

Antworten

  • Hallo,

    mit Regulären Ausdrücken bist du schon richtig, allerdings muss er etwas komplexer sein. Das Pattern ist "(?<=Allowed\s)\d+"

    Mit (?<=Allowed\s) beschreibst du, das vor deinem gesuchten Ausdruck "Allowed" und ein Leerzeichen stehen sollen. (?<=) ist dabei die Anweisung, dass es davor steht, aber nicht Teil des gesuchten Ausdrucks selbst sein soll.

    "\d+" sucht nach beliebig vielen Zahlen, aber es muss mindestens eine Zahl da sein.

    Select-String gibt ein ganzes Objekt mit mehreren Eigenschaften zurück, die wiederum komplex sind. Ab PowerShell 3.0 (oder erst 4.0?) kannst du

    $Text | Select-String "(?<=Allowed\s)\d+" -AllMatches | foreach{$_.Matches.Value}

    verwenden. Falls du noch PowerShell 2.0 hast, musst du hinten

    $Text | Select-String "(?<=Allowed\s)\d+" -AllMatches | foreach{$_.Matches} | foreach{$_.Value}

    ändern. Es kann sein, dass Matches oder Value noch Klammern als Methodenaufruf brauchen, das weiß ich nicht mehr sicher.

    Viele Grüße

    Christoph

    Freitag, 22. Januar 2016 08:01

Alle Antworten

  • Hi,

    im einfachsten fall kannst du das so lösen:

    $pos1 = $foo.IndexOf("Allowed") +7
    $pos2 = $foo.IndexOf("Quarantined")
    
    $value= $foo.Substring($pos1,$pos2-$pos1)
    

    Man könnte hier auch vielleicht mit einem RegEX-Ausdruck nach dem Wert im String filtern, aber vielleicht hilft dir obiger Ansatz ja schon weiter.

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Freitag, 22. Januar 2016 07:58
  • Hallo,

    mit Regulären Ausdrücken bist du schon richtig, allerdings muss er etwas komplexer sein. Das Pattern ist "(?<=Allowed\s)\d+"

    Mit (?<=Allowed\s) beschreibst du, das vor deinem gesuchten Ausdruck "Allowed" und ein Leerzeichen stehen sollen. (?<=) ist dabei die Anweisung, dass es davor steht, aber nicht Teil des gesuchten Ausdrucks selbst sein soll.

    "\d+" sucht nach beliebig vielen Zahlen, aber es muss mindestens eine Zahl da sein.

    Select-String gibt ein ganzes Objekt mit mehreren Eigenschaften zurück, die wiederum komplex sind. Ab PowerShell 3.0 (oder erst 4.0?) kannst du

    $Text | Select-String "(?<=Allowed\s)\d+" -AllMatches | foreach{$_.Matches.Value}

    verwenden. Falls du noch PowerShell 2.0 hast, musst du hinten

    $Text | Select-String "(?<=Allowed\s)\d+" -AllMatches | foreach{$_.Matches} | foreach{$_.Value}

    ändern. Es kann sein, dass Matches oder Value noch Klammern als Methodenaufruf brauchen, das weiß ich nicht mehr sicher.

    Viele Grüße

    Christoph

    Freitag, 22. Januar 2016 08:01
  • Hallo Christian,

    $pos1 liefert mir 6 zurück, und $pos2 liefert mir -1 zurück (was die 6 aus pos1 erklärt :-)

    Kann es sein dass ich irgendetwas wegen den Zeilenumbrüchem im String beachten muss ? Mir fällt nämlich gerade auf dass auch mit $text.contains nur die erste Zeile durchsucht wird.

    PS C:\> $Text
    a
    Page 1
    Count
    Allowed 2718
    Quarantined 486
    Replaced 19
    Action Count Count (%)
    Allowed 2718 84.33
    Quarantined 486 15.08
    Replaced 19 0.59
    Total: 3 3223
    
    PS C:\> $text.contains("a")
    True
    
    PS C:\> $text.contains("Page")
    False
    
    PS C:\> $text.contains("Allowed")
    False
    

    Freitag, 22. Januar 2016 08:13
  • Super, das funktioniert. Vielen Dank !
    Freitag, 22. Januar 2016 08:22