Strings suchen und ersetzen in mehreren Dateien

In mehreren Dateien soll ein bestimmter Text gesucht und falls vorhanden ersetzt werden und gerade kein Tool zur Hand? Die Powershell kann das!

Snippet:

1
Get-ChildItem *.dat | Foreach-Object {Get-Content $_ | Out-String | Foreach-Object {$_.Replace("altes Haus","neues Schloß")} | Set-Content $_}

Achtung:
Die ursprüglichen Dateien werden dabei überschrieben!

Strings suchen und ersetzen in einer Datei

In einer Datei soll ein bestimmter Text gesucht und falls vorhanden ersetzt werden und gerade kein Tool zur Hand? Die Powershell kann das auch!

Snippet:

1
Get-Content "D:\Test.txt" | Foreach-Object {$_.Replace("Alt","Neu")} | Set-Content "D:\Test_Neu.txt"

Hier wird einfach der Inhalt der Datei “Test.txt” eingelesen und durchlaufen. Kommt der String “Alt” vor so wird dieser durch “Neu” ersetzt. Anschließend wird die Datei komplett in eine neue (“Test_Neu.txt”) geschrieben.

Nullen vor Zahl anfügen

Manchmal macht es Sinn vor eine Zahl mehrere Nullen (000…) zu stellen, um z.B. die Lesbarkeit zu verbessern, oder alle Zahlen in einem Format zu haben.

In Visual Basic oder Visual Basic for Applications kann hierfür die Funktion “Format” verwendet werden. Allerdings muss eine Typenkonvertierung von Zahl zu Text vorgenommen werden, da z.B. “00242″ keine normale Zahl ist und die Nullen weggelassen bzw. nicht angezeigt werden.

Meine VBA-Funktion:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Function NullenVorZahlAnfuegen(intZahl As Integer, intStellen As Integer) As String
    Dim intI As Integer
    Dim strTmp As String
 
    If Len(intZahl) < intStellen Then
        For intI = 1 To intStellen
            strTmp = strTmp & "0"
        Next intI
 
        NullenVorZahlAnfuegen = Format(intZahl, strTmp)
    Else
        NullenVorZahlAnfuegen = ""
    End If
End Function

Ziemlich wahrscheinlich gibt es noch schnellere oder kürzere Wege das zu tun, aber meine funktioniert auch! ;-)

Bestimmte Zeile einer Ausgabe zeigen

Möchte man nur eine bestimmte Zeile einer Befehlsausgabe anzeigen, so kann folgendes helfen:

1
2
$tmp = ping -n 1 localhost
$tmp[5,-1,0]

Hier wird ein ein normaler Ping auf den eigenen PC ausgeführt und die Ausgabe des Ping-Befehls in die Variable “$tmp” gespeichert. Anschließend wird mit “[5,-1,0]” fetgelegt, welche Zeile angezeigt wird.
“$tmp[0]” zeigt dabei z.B. die erste Zeile an, “$tmp[-1]” die letzte Zeile.

Mit Select-String geht das auch, wie ich in einem Beispiel hier gezeigt habe.

Kommando-Ausgaben mit Select-String filtern

Heute habe ich schauen wollen, welche Anwendung den Port 80 auf meinem Computer belegt, da der Apache Webserver nicht mehr starten konnte.
Mit dem Netstat-Befehl von Windows und den Parametern “-a -f -b” werden einem die offnenen Netzwerkverbindungen inkl. dem Exe-Namen angezeigt:

1
netstat -a -f -b

Da nun aber sehr viele Programme Ports öffnen kann die Liste sehr lange und übersichtlich werden. Hier kommt mal wieder die Powershell gerade richtig…
Da die Ausgabe von Netstat in der Powershell ebenso ausgegeben wird, wie in der Eingabeaufforderung, kann diese mit dem Commandlet “Select-String” gefiltert werde.

Lange Erklärung kurzer Befehl… :-)

1
netstat -a -f -b | Select-String -pattern ":80" -context 0, 1

Ich mache hier nichts anderes, als das Netstat-Kommando ausführen und die Ausgabe nach “:80″ zu filtern. Da der Anwendungsname nicht in der gleichen Zeile steht wie das Kriterium, lasse ich mir zusätzlich mit dem Parameter “Context” eine Zeile zusätzlich nach dem Suchkriterium ausgeben.