Grep mit der PowerS­hell

Im letz­ten Blog­ein­trag haben wir uns ange­se­hen, wie man den Win­dows CMD Befehl more bezie­hungs­weise den opti­mier­ten Linux Befehl less mit der PowerS­hell abbil­den kann.
 
In die­sem Blog­ein­trag schauen wir uns an, wie man den genia­len Linux bash Befehl grep mit PowerS­hell Befeh­len nach­bil­den kann.
 
Der Begriff grep steht für global/​regu­lar expression/​print (Danke wiki­pe­dia 🙂 ) und dient dem Suchen und Fil­tern von Dateien und Befehls­aus­ga­ben. Gerade bei gro­ßen Log­da­teien kann man so sehr schnell die rele­van­ten Zei­len fin­den.
 
Der Befehl grep war frü­her (zu Zei­ten, als es noch keine PowerS­hell gab) für mich der Haupt­grund, unter Win­dows Cyg­win zu nut­zen. Cyg­win ermög­licht es, Linux bash Befehle wie z.B. grep unter Win­dows zu aus­zu­füh­ren. Mit der moder­nen PowerS­hell ist dies nicht mehr not­wen­dig.
 
In der PowerS­hell nutzt man 2 Befehle, um den grep Befehl abzu­bil­den.
 
Zum einen den Befehl Out-​​String –Stream. Die­ser sorgt dafür, dass die Aus­gabe des vor­he­ri­gen Befehls sicher zei­len­weise wei­ter­ge­ge­ben wird. Ansons­ten könn­ten wir nicht zei­len­weise die Aus­gabe durch­su­chen
 
Als Bei­spiel nehme ich die Aus­gabe der Hilfe und zähle die Anzahl der ent­hal­te­nen Zei­len­ob­jekte.
 
(Get-​​Help Get-​​ChildItem –Detailed).count  gibt als Ergeb­nis 0 aus. Die ganze Aus­gabe der Hilfe ist eine lange, mit Son­der­zei­chen for­ma­tierte Zeile.
 
(Get-​​Help Get-​​ChildItem –Detailed |Out-​​String –Stream).count gibt als Ergeb­nis 159 aus. Immer nach dem Son­der­zei­chen „Zei­len­um­bruch“ bzw. CRLF wird eine neue Zeile erzeugt.
 

Zum ande­ren der Befehl Select-​​String. Mit die­sem Befehl kann ich ein­zelne Strings nach Wör­tern oder Mus­tern durch­su­chen.
 
Über den Para­me­ter –Pat­tern gebe ich das zu suchende Wort, die Wort­liste oder das Mus­ter an (Hier kön­nen auch regu­läre Aus­drü­cke genutzt wer­den – dar­auf möchte ich nicht wei­ter ein­ge­hen. Das pas­sende Buch von O‚Reilly „Mas­te­ring Regu­lar Expres­si­ons“ hat 544 Sei­ten)
 
Mit dem Para­me­tern –Sim­ple­Match teile ich der PowerS­hell mit, dass der Pat­tern kein regu­lä­rer Aus­druck ist.
Mit dem Para­me­ter –Case­Sen­si­tive beach­tet die PowerS­hell, ob die Buch­sta­ben groß oder klein­ge­schrie­ben sind.
 
Als Bei­spiel neh­men wir wie­der unse­ren Get-​​Help Befehl von vor­hin.
 
Ich möchte alle Zei­len fin­den, in denen das ein­zelne Wort „Cert“ vor­kommt.
 
Get-​​Help Get-​​ChildItem –Detailed | Out-​​String –Stream | Select-​​String –Pat­tern „Cert“ –Sim­ple­Match
 

Wenn ich meh­rere mög­li­cher Such­wör­ter habe, dann erstelle ich eine kurze String­liste

$pat­tern = „Cert“,“HKLM

Get-​​Help Get-​​ChildItem –Detailed |Out-​​String –Stream |Select-​​String –Pat­tern $pat­tern –Sim­ple­Match

Ein wei­te­res Bei­spiel aus der IT Admi­nis­tra­ti­ons Pra­xis sind die DHCP Ser­ver logs.

Frage: Der Cli­ent AR-​​IT mit der MAC Adresse „90dd5d8e6d34“ und der IP 10.12.1.29 ver­hält sich komisch. Lie­ber DHCP Ser­ver: weißt du irgend­wel­che Details?

Lösungs­weg: 

$pat­tern = „AR-IT“,“90dd5d8e6d34″,“10.12.1.29   # Eins von den dreien soll vor­kom­men

Get-​​Content C:\Windows\System32\dhcp\DhcpSrvLog-Die.log | Out-​​String –Stream |Select-​​String –Pat­tern $pat­tern –Sim­ple­Match

Ant­wort: O.K., der DHCP Cli­ent Dienst vom AR-​​IT spinnt und fragt alle 1 – 4 Minu­ten nach einer neuen IP Adresse. Reboot tut gut. Pro­blem ist gelöst 🙂

 

Was den­ken Sie?