Powershell Tail und Head vereint

Ausgabe der letzten und der ersten n-Zeilen in einemBefehl

In Unix/Linux Derivaten sind die Befehle tail und Head oft benutzte Werkzeuge zur Ausgabe der ersten/letzten Zeilen einer Datei oder der Ergebnisse eines Befehls. Direkt kombinieren kann man sie nicht. Hier sind sed/awk und andere Werkzeuge und Lösungen gefordert. Powershell bietet eine sehr effiziente Lösung.

Der erste Ansatz wäre die Ausgabe mit Select -Last und Select -First zu behandeln.

Get-ChildItem somefolder | Select -First 10

Get-ChildItem somefolder | Select -Last 10

Das geht aber nicht in einem Befehl (oder nur mit einer zu schreibenden Funktion). Damit haben wir das gleiche Problem wie mit head und tail in Unix.

Per Get-ChildItem und einem auf die Ausgabe angewendetem Sort Befehl erhält man eine Liste. Diese Ausgabe kann man als Array / Liste von Zeichenketten interpretieren und einzelne Elemente mit einen nachfolgenden Index in eckigen Klammern auswählen.

(Get-Content hashes.csv)[1]

Der “Trick” besteht darin, dass eine solche Powershell Liste auch einen Bereich adressieren kann und dieser Bereich “überlaufen” darf und dann von vorn anfängt. [0..10] gibt die ersten 11 Elemente aus. [10..-1] gibt alle Zeilen ab der 11. Zeile bis zur letzten (-1) aus.

[-10..10] gibt die letzten  10 und die ersten 11 Zeilen  aus (da 0 die erste Zeile ist). Das Ergebnis sieht etwas ungewöhnlich aus, da zuersrt die letzten Zeilen ausgegeben werden:

(gci $folder *jpg |Sort-Object LastWriteTime)[-10..10]

Dier zweite bis zehnte Zeile der Datei und die letzten sind sind in den blauen Rechtecken hervorgehoben, dier erste Zeile der Ausgabeliste ist in der Mitte.

Dieses Verfahren funktioniert für alle Listausgaben, wie Get-ChildIten, Get-Content, Get-Prozess und so weiter.