Uniq mit der PowerShell

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?

Pflichtfelder sind mit einem * markiert.