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
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
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
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
Get-Command -ParameterName Uniq* | Ft CommandType, Name
Und siehe da, es gibt 2 Befehle, die einen Uniq Parameter mitbringen.
Mit
Get-Command -ParameterName Uniq* | FL Name,ParameterSets
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
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
Get-Content .\Logfile.txt
Unsortiert und unique:
Get-Content .\Logfile.txt |Select-Object -Unique
Get-Content .\Logfile.txt |Select-Object -Unique
Sortiert und unique:
Get-Content .\Logfile.txt |Sort-Object -Unique
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
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
Get-ChildItem | Select-Object -Property Basename -Unique
bekomme ich das passende Ergebnis. Der Basename Logfile wird nur noch 1x ausgegeben
Was denken Sie?