Der erste Teil Ihrer Frage ist einfach. Wie bereits erwähnt, akzeptiert cut das Weglassen des Start- oder Endindex eines Spaltenbereichs und interpretiert dies als "vom Anfang bis zur Spalte n (einschließlich)" oder "von der Spalte n (einschließlich) bis zum Ende". beziehungsweise:
$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test
Es unterstützt auch das Kombinieren von Bereichen. Wenn Sie möchten, z. B. die ersten 3 und die letzten 2 Spalten in einer Reihe von 7 Spalten:
$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz
Der zweite Teil Ihrer Frage kann jedoch etwas kniffliger sein, je nachdem, welche Art von Eingabe Sie erwarten. Wenn Sie mit "letzte n Spalten" "letzte n Spalten (unabhängig von ihren Indizes in der gesamten Zeile)" meinen (dh weil Sie nicht unbedingt wissen, wie viele Spalten Sie im Voraus finden werden), ist dies leider nicht der Fall möglich verwenden zu erreichen cut
allein. Um cut
die letzten n Spalten in jeder Zeile effektiv herausziehen zu können , muss die Gesamtzahl der in jeder Zeile vorhandenen Spalten im Voraus bekannt sein und jede Zeile muss in der Anzahl der darin enthaltenen Spalten konsistent sein.
Wenn Sie nicht wissen, wie viele „Spalten“ in jeder Zeile vorhanden sein können (z. B. weil Sie mit Eingaben arbeiten, die nicht streng tabellarisch sind), müssen Sie awk
stattdessen so etwas wie verwenden. Um beispielsweise awk
die letzten 2 "Spalten" (awk nennt sie Felder, deren Anzahl pro Zeile variieren kann) aus jeder Eingabezeile herauszuziehen :
$ printf '/a\n/a/b\n/a/b/c\n/a/b/c/d\n' | awk -F/ '{print $(NF-1) FS $(NF)}'
/a
a/b
b/c
c/d