Im letzten Blogeintrag haben wir uns außer der Reihe Exchange Quotas auf deutschen Servern angesehen.
In diesem Blogeintrag komme ich zur Serie "tolle Linux bash Befehle" mit der PowerShell zurück: Wir schauen uns die Portierung des bash Befehls uniq an.
Der bash Befehl uniq ist sehr mächtig mit vielen Optionen. Der einfachste Einsatz dient dem Entfernen von doppelten Zeilen in einem Textdokument und dann auch gleich sortiert.
Ein typischer Anwendungsfall ist eine Logdatei mit vielen sich wiederholenden IPs
bbirneder@bbirneder:/mnt/c/temp$ cat Logfile.txt
10.10.0.7
10.10.0.5
10.10.0.7
1 2 3 4 |
bbirneder@bbirneder:/mnt/c/temp$ cat Logfile.txt 10.10.0.7 10.10.0.5 10.10.0.7 |
Mit einem sort muss ich erst sortieren und kann dann mit uniq die sortierte Liste von doppelten Einträgen bereinigen
bbirneder@bbirneder:/mnt/c/temp$ sort Logfile.txt
10.10.0.5
10.10.0.7
10.10.0.7
1 2 3 4 |
bbirneder@bbirneder:/mnt/c/temp$ sort Logfile.txt 10.10.0.5 10.10.0.7 10.10.0.7 |
bbirneder@bbirneder:/mnt/c/temp$ sort Logfile.txt |uniq
10.10.0.5
10.10.0.7
1 2 3 |
bbirneder@bbirneder:/mnt/c/temp$ sort Logfile.txt |uniq 10.10.0.5 10.10.0.7 |
In der PowerShell gibt es keinen nativen uniq Befehl. Mit einem Get-Command kann ich aber suchen, ob irgendein anderer Befehl einen uniq Parameter hat.
Durch den * = Wildcard kann ich unschärfer suchen
Get-Command -ParameterName Uniq* | Ft CommandType, Name
1 |
Get-Command -ParameterName Uniq* <em>| Ft CommandType, Name</em> |
Und siehe da, es gibt 2 Befehle, die einen Uniq Parameter mitbringen.
Mit
Get-Command -ParameterName Uniq* | FL Name,ParameterSets
1 |
Get-Command -ParameterName Uniq* |FL Name,ParameterSets |
kann ich sehen, dass der Parameter anders als bei der bash nicht uniq, sondern -unique heißt
Mit
Get-Help Select-Object -Parameter Unique
1 |
Get-Help Select-Object -Parameter Unique |
kann ich mir eine kurze Hilfe zu dem Parameter dazu ausgeben lassen.
In einer modernen Windows 10 PowerShell ist die Ausgabe der Hilfe auf Englisch,
auf einem alten, virtuellen WIndows 7 Client ist sie noch Deutsch
- Select-Object -unique löscht alle doppelten Einträge (Dubletten)
- Sort-Object -unique löscht alle doppelten Einträge (Dubletten) und sortiert die Liste
Unser IP Listen Beispiel von vorhin ginge dann so:
Die IP Liste ausgeben:
Get-Content .\Logfile.txt
1 |
Get-Content .\Logfile.txt |
Unsortiert und unique:
Get-Content .\Logfile.txt |Select-Object -Unique
1 |
Get-Content .\Logfile.txt |Select-Object -Unique |
Sortiert und unique:
Get-Content .\Logfile.txt |Sort-Object -Unique
1 |
Get-Content .\Logfile.txt |Sort-Object -Unique |
Wenn es um keine Textdatei, sondern um eine Objekt Liste geht, dann muss ich das entsprechende Attribut angeben.
Als Beispiel habe ich hier 2 Dateien Logfile.log und Logfile.txt
Get-ChildItem | Ft Name,Basename,Extension
1 |
Get-ChildItem | Ft Name,Basename,Extension |
Ich möchte den Hauptnamen (vor der Extension) unique, d.h. einmalig bekommen.
Mit
Get-ChildItem | Select-Object -Property Basename -Unique
1 |
Get-ChildItem | Select-Object -Property Basename -Unique |
bekomme ich das passende Ergebnis. Der Basename Logfile wird nur noch 1x ausgegeben
Was denken Sie?