Wie sortiere ich eine ls-artige Dateiliste?

519
george

Wie sortiere ich nach der letzten Spalte eine Liste, die wie folgt aussieht:

drwxr-sr-x 2 user group 4096 2018-02-19 14:11:42 /something/project/somefile drwxr-sr-x 2 user group 4096 2018-02-19 00:14:50 /blah-blah/anything -rw-r----- 1 someone users 2188 2018-07-21 13:52:59 /aaa/222 drwxr-S--- 2 someone users 4096 2018-06-25 14:27:42 /bbb/333/anything/whatever -rw-r----- 1 someone users 715 2018-06-16 20:09:58 /xxx/aaa/666 

* Die Liste befindet sich in einer Datei, wird aber nicht generiert, lssodass ich die Funktionalität von ls nicht verwenden kann.

0

1 Antwort auf die Frage

2
Attie

Sie können verwenden sort:

sort -k8,8 <<EOF drwxr-sr-x 2 user group 4096 2018-02-19 14:11:42 /something/project/somefile drwxr-sr-x 2 user group 4096 2018-02-19 00:14:50 /blah-blah/anything -rw-r----- 1 someone users 2188 2018-07-21 13:52:59 /aaa/222 drwxr-S--- 2 someone users 4096 2018-06-25 14:27:42 /bbb/333/anything/whatever -rw-r----- 1 someone users 715 2018-06-16 20:09:58 /xxx/aaa/666 EOF 

-kWählt das Feld aus, nach dem sortiert werden soll, 8,8sagt, dass die Daten von Feld 8 bis Feld 8 sortiert werden sollen.

Sie können -tdas Feldtrennzeichen definieren, obwohl hier der Standardwert fein ist (nicht leerer zu leerer Übergang).

Ausgabe:

-rw-r----- 1 someone users 2188 2018-07-21 13:52:59 /aaa/222 drwxr-S--- 2 someone users 4096 2018-06-25 14:27:42 /bbb/333/anything/whatever drwxr-sr-x 2 user group 4096 2018-02-19 00:14:50 /blah-blah/anything drwxr-sr-x 2 user group 4096 2018-02-19 14:11:42 /something/project/somefile -rw-r----- 1 someone users 715 2018-06-16 20:09:58 /xxx/aaa/666 

Um nachzufragen, haben Sie gefragt:

Meine Datei, die die Liste enthält, enthält auch N Anfangs- und M Endzeilen, die nicht in der oben gezeigten spaltenartigen Form sind. Leider bringt die Sortierung sie durcheinander. Wie kann ich diese Zeilen ausschließen und nur die Spalten sortieren?

Sie müssen wissen, wie viele Zeilen sich vor / in / nach dem zu sortierenden Block befinden, und Sie können die unten verwendeten Werte durch Variablen ersetzen. Eine einfache Pipeline wie unten gezeigt kann gut funktionieren.

Inhalt von data.txt:

Zline1 Zline2 drwxr-sr-x 2 user group 4096 2018-02-19 14:11:42 /something/project/somefile drwxr-sr-x 2 user group 4096 2018-02-19 00:14:50 /blah-blah/anything -rw-r----- 1 someone users 2188 2018-07-21 13:52:59 /aaa/222 drwxr-S--- 2 someone users 4096 2018-06-25 14:27:42 /bbb/333/anything/whatever -rw-r----- 1 someone users 715 2018-06-16 20:09:58 /xxx/aaa/666 AlineN-1 AlineN 

Pipeline:

(head -n 2; head -n 5 | sort -k8,8; cat) < data.txt 

Ausgabe:

Zline1 Zline2 -rw-r----- 1 someone users 2188 2018-07-21 13:52:59 /aaa/222 drwxr-S--- 2 someone users 4096 2018-06-25 14:27:42 /bbb/333/anything/whatever drwxr-sr-x 2 user group 4096 2018-02-19 00:14:50 /blah-blah/anything drwxr-sr-x 2 user group 4096 2018-02-19 14:11:42 /something/project/somefile -rw-r----- 1 someone users 715 2018-06-16 20:09:58 /xxx/aaa/666 AlineN-1 AlineN 
Vielen Dank! Darf ich auch fragen: Meine Datei, die die Liste enthält, enthält auch N Anfangs- und M Endzeilen, die nicht in der oben gezeigten spaltenartigen Form sind. Leider bringt die Sortierung sie durcheinander. Wie kann ich diese Zeilen ausschließen und nur die Spalten sortieren? george vor 5 Jahren 0
Siehe mein Update :-) Attie vor 5 Jahren 1
Vielen Dank! Eigentlich fand ich das `(head -n; Schwanz -n +| Kopf -n -| sort -s -k8,8; Schwanz -n) <data.txt` funktioniert auch (ohne die Anzahl der Zeilen in der "Mitte" zu kennen). Leider fehlen die letzten "M" -Zeilen, so dass ich es als separate Zeile im Skript tun musste. Vielleicht wäre es perfekt, wenn Sie wissen, wie man es pipeline (da ich vielleicht falsch liege) :) Aber das funktioniert auch! george vor 5 Jahren 0
Die Verwendung von "tail" funktioniert nicht, da sie die vollständige Eingabe lesen muss, um herauszufinden, wie viele Zeilen vom Ende verwendet werden sollen ... also in diesem Fall das letzte "tail -n" `bekommt nichts auf` stdin`, weil der vorherige `tail -n +`hat alles genommen! Attie vor 5 Jahren 0