PowerShell Grep
-
Select-String
Cmdlet - Typische Grep-Aufgabe mit PowerShell
- Verwenden von PowerShell Select-String zum Suchen von Mustern
Wohin gehen Sie beim Entwickeln von PowerShell-Code, wenn Sie nach Inhalten in einer Zeichenfolge oder einer ganzen Textdatei suchen müssen? Sie sind mit dem beliebten grep-Dienstprogramm vertraut, wenn Sie viel mit Linux gearbeitet haben. Mit dem Dienstprogramm grep können Benutzer Text mithilfe verschiedener Parameter finden. Es ist jedoch nicht in Windows verfügbar. In diesem Szenario haben wir also das Select-String-Cmdlet in PowerShell.
Select-String
Cmdlet
Select-String
sucht standardmäßig in jeder Zeile nach der anfänglichen Übereinstimmung und zeigt dann die Zeilennummer, den Dateinamen und den Text an, der zu der übereinstimmenden Zeile gehört. Select-String
kann auch mit mehreren Dateicodierungen arbeiten, z. B. Unicode-Text, indem der Codierungstyp mithilfe der Byte-Order-Mark (BOM) bestimmt wird. Select-String geht davon aus, dass es sich um eine UTF8-Datei handelt, wenn die BOM fehlt.
Einige Verwendungen des Cmdlets Select-String
werden unten erklärt.
Typische Grep-Aufgabe mit PowerShell
Beginnen wir mit einem Beispiel. Nehmen wir an, wir haben einen String mit Namen und Adressen, und außerdem ist der String unstrukturiert. Wir wollen die Namen extrahieren. Wie wir es also machen werden, wird unten erklärt.
||Sara Peiris|| 37, De silva road, Panadura
--||Tim Gangster||-- 345, Yolks street,KL
==|Suz Maker|== 44 Main, Cydney, CA
Der obige Text wird der Variable users
zugewiesen. Bei dem Versuch wird also mit dem Parameter Pattern
nach einem Namen gesucht.
test | Select-String -Pattern 'Sara Peiris'
Ausgabe:
Hier können wir verstehen, dass die Select-String-Methode funktioniert hat, aber nicht die angegebene zurückgegeben hat, da wir die gesamte Zeichenfolge übergeben haben. Lassen Sie uns daher versuchen, einzelne Zeilen zu übergeben, indem Sie das Zeilenumbruchzeichen verwenden, da jeder spezifische Eintrag in einer einzelnen Zeile angegeben wird
PS> test = test -split "`n"
PS> test | Select-String -Pattern 'Sara Peiris'
Ausgabe:
Hier können wir sehen, dass es eine einzelne Zeile zurückgibt. Als nächstes sollten wir nach einer Möglichkeit suchen, wie wir mehrere Zeilen zurückgeben können.
Verwenden von PowerShell Select-String zum Suchen von Mustern
Hier müssen wir gemeinsame Muster finden, die für alle Linien gültig sind. Wenn wir also das vorherige Beispiel nehmen, können Sie sehen, dass alle Namen mit |
umgeben sind. und die Namen werden durch ein Leerzeichen getrennt. Nehmen wir nun dieses Muster mit der Regex und senden es mit dem Parameter Pattern
.
Select-String
hat die Regex verwendet, um jede Zeile abzurufen; Danach muss ich alle Namen trennen. Ich benötige im Moment nicht die Adressen für jeden. Dazu verwenden wir das Attribut Matches
jedes übereinstimmenden Objekts, das von Select-String zurückgegeben wird.
PS> test | Select-String -Pattern '\|\w+ \w+\|' | foreach {$_.Matches}
Ausgabe:
Jetzt können Sie sehen, dass das Value-Attribut die Namen hat, die wir benötigen, aber sie sind immer noch von dem |
umgeben. Charakter. Das liegt daran, dass die Regex-Übereinstimmung das |
enthielt Zeichen in den Namen.
Die Pipe-Zeichen müssen immer noch im Filter enthalten sein, aber wir möchten nicht, dass sie als Übereinstimmungen zurückgegeben werden. Regex-Gruppen sind eine Methode. Das Ergebnis, das Sie zurückgeben möchten, ist von Klammern umgeben, die auf Regex-Gruppen hinweisen. In dieser Situation versuche ich es erneut, indem ich die Regex-Zeichenfolge einschließe, die den Vor- und Nachnamen darstellt.
PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches}
Ausgabe:
Das |
Das Zeichen wird im Wert angezeigt, aber was auch immer wir sehen können, die Gruppe wurde zu {0,1}
, was bedeutet, dass Select-String die Gruppe identifiziert hat.
Ich füge die Referenz erneut in die for
-Schleife ein, um diese Gruppe zu sehen. Da jedes Gruppenattribut ein Array ist, können wir auf das erste Mitglied verweisen, indem wir es in Klammern setzen und dann die Value-Eigenschaft verwenden.
PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches.Groups[1].Value}
Ausgabe:
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.