nl: Wie beginnen Zeilennummern in der zweiten Zeile?

nl: Wie beginnen Zeilennummern in der zweiten Zeile?

Dies ist die Standardausgabe vonls -ln | nl

wolf@linux:~$ ls -lh | nl
     1  total 24
     2  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     3  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     4  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py
wolf@linux:~$

total 24Wäre es möglich, die Nummer statt mit mit bei den eigentlichen Dateien/Verzeichnissen zu beginnen, also bei der zweiten Zeile?

Gewünschte Ausgabe

wolf@linux:~$ ls -lh | nl
        total 24
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py
wolf@linux:~$

Antwort1

Verbrauchen Sie die erste Zeile mit etwas anderem und übergeben Sie den Rest annl

$ ls -lh | { sed -u q; nl; }
total 24
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

sed(mit -uzum Deaktivieren der Pufferung), verbraucht eine Zeile und quit, wobei die Zeile vor der Beendigung implizit gedruckt wird. nlverbraucht den Rest der Zeilen.

Wenn Sie die erste Zeile wirklich eingerückt haben möchten, können Sie dies folgendermaßen tun:

$ ls -lh | { sed -u 's/^/        /;q'; nl; }
        total 24
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

Wenn Sie die Zeilennummerierung weiter unten beginnen lassen möchten, geben Sie an, sedwann qausgestiegen werden soll:

$ ls -alh | { sed -u 's/^/        /;3q'; nl; }
        total 24
        drwx------ 1 wolf wolf  186 Sep  24 22:18 .
        drwx------ 1 wolf wolf  186 Sep  24 22:18 ..
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

/\.\.$/qSie können anstelle von auch etwas wie verwenden 3q.

Antwort2

Dadurch wird nlbei 0 begonnen:

$ ls -lh | nl -v 0
   0  total 24
   1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
   2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
   3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

Antwort3

Es ist irgendwie hässlich, aber zumindest mit der GNU Coreutils-Implementierung von nlkönnen Sie die zu nummerierenden Zeilen über einen regulären Ausdruck angeben - da tist nicht einer der möglichen Dateitypen in der lsLonglist-Ausgabe1du könntest es tun

ls -lh | nl -bp'^[^t]'

Leider bleibt die Ausgabeausrichtung dadurch jedoch nicht erhalten.

Der formal korrekteste Ansatz besteht wahrscheinlich darin, die lsAusgabe in unterschiedliche Header- und Body-Abschnitte aufzuteilen:

$ ls -lh | sed -e '1s/.*/\\:\\:\\:\n&\n\\:\\:/' | nl

       total 0

     1  -rw-rw-rw- 1 steeldriver steeldriver   0 Sep  9 19:53 bar
     2  -rw-r--r-- 1 steeldriver steeldriver 449 Sep 16 17:41 bash_envs
     3  -rw-rw-rw- 1 steeldriver steeldriver 131 Sep  5 18:13 dirlist
     4  -rw-r--r-- 1 steeldriver steeldriver 359 Sep 13 19:42 error_status

(standardmäßig ist der Kopfzeilen-Nummerierungsstilkeiner).

Antwort4

Sie können es stattdessen mit Folgendem versuchen awk:

ls -lh | awk '{printf("%5s  ",NR==1?" ":NR-1); print}'

Dadurch wird die Zeile „Summen“ ohne Nummerierung und alle übrigen Zeilen mit Zahlen rechtsbündig mit einer Feldbreite von 5 ausgedruckt. Der Abstand zwischen Zahl und Zeileninhalt beträgt zwei Leerzeichen (der Text nach dem 5sin der printf()Formatzeichenfolge); Sie können ihn durch etwas anderes ersetzen, beispielsweise \t.

Wenn Sie die Zeile "Totals" nicht benötigen, können Sie

ls -lh | awk 'NR>1{print (NR-1) "\t" $0}'

oder

ls -lh | awk 'NR>1 {printf("%5s  ",NR-1); print}'

stattdessen.

verwandte Informationen