Probleme beim Analysieren einer Protokolldatei in der PowerShell-Pipeline

395
Alexamation
(new-object System.Net.WebClient).DownloadFile('http://192.168.100.1/cgi-bin/status_cgi','C:\file.txt') 

Ruft die Statusseite von einem Arris Modem ab.

select-string -Path "C:\file.txt" -pattern "Uptime" 

ergibt:

C:\file.txt:96:<tbody><tr><td width="160">System Uptime: </td><td>0 d: 18 h: 33 m</td></tr> 

wie erwartet, aber

(new-object System.Net.WebClient).Downloadstring('http://192.168.100.1/cgi-bin/status_cgi') | select-string -pattern 'Uptime' 

druckt die gesamte Seite und wählt die Zeichenfolge nicht aus.

Das Anfordern der Stream-Ausgabe von Webclient wird auch nicht "pfeifen"

(new-object System.Net.WebClient).openread('http://192.168.100.1/cgi-bin/status_cgi') | select-string -pattern 'Uptime' 

Was vermisse ich?

1
Sie müssen den zurückgegebenen String mit dem Operator "-split" -> "(neues-Objekt System.Net.WebClient) .openread ('http://192.168.100.1/cgi-bin/status_cgi') -split aufteilen "` r? `n" | select-string -pattern 'Uptime'` LotPings vor 5 Jahren 1

1 Antwort auf die Frage

-1
maoizm

Wenn Sie die Ausgabe System.Net.WebClientan Select-String übergeben, wird die Ausgabe als eine Zeichenfolge behandelt. Aus diesem Grund wird die Ausgabe als Ganzes abgeglichen.

Wenn Sie die Ausgabe von System.Net.WebClientin einer Datei speichern und sie dann mit lesen Select-String -Path path/to/the/file, behandelt Select-String den Inhalt der Datei als Zeilenarray und gibt nur Zeilen zurück, die mit dem Muster übereinstimmen.

Zu Ihrer Information: In PowerShell 3+ ist es bequemer, das Cmdlet Invoke-WebRequest zu verwenden:

$uri = 'http://192.168.100.1/cgi-bin/status_cgi' (Invoke-WebRequest -Uri $uri).Content -split "`n" | Select-String -SimpleMatch Uptime 

Verweise: