nl: Как начать нумерацию строк со второй строки?

nl: Как начать нумерацию строк со второй строки?

Это стандартный выводls -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 24, можно ли начать его с фактического файла/каталога, который находится во второй строке?

Желаемый результат

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:~$

решение1

Используйте первую строку вместе с чем-то другим, а остальное передайтеnl

$ 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-uотключением буферизации), будет потреблять одну строку и quit, неявно печатая строку перед завершением. nlпотребляет оставшиеся строки.

Если вы действительно хотите сделать отступ в первой строке, это можно сделать следующим образом:

$ 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

Если вы хотите начать нумерацию строк дальше, укажите, sedкогда это нужно qсделать:

$ 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

Вы также можете использовать что-то вроде /\.\.$/qвместо 3q.

решение2

Это запустит nlначало с 0:

$ 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

решение3

Это немного некрасиво, но, по крайней мере, с реализацией GNU Coreutils nlвы можете указать строки, которые нужно пронумеровать, с помощью регулярного выражения, поскольку tэто не один из возможных типов файлов в lsвыводе длинного списка.1ты мог бы сделать

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

К сожалению, это не сохраняет выравнивание выходных данных.

Возможно, наиболее формально правильным подходом будет разделение lsвывода на отдельные разделы заголовка и тела:

$ 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

(по умолчанию стиль нумерации заголовковникто).

решение4

Вместо этого вы можете попробовать awk:

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

Это напечатает строку «итоговые данные» без ее нумерации и все остальные строки с числами, выровненными по правому краю, с шириной поля 5. Расстояние между числом и содержимым строки будет составлять два пробела (текст после 5sв printf()строке формата); вы можете заменить его чем-то другим, например \t.

Если вам не нужна строка «итого», вы можете использовать

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

или

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

вместо.

Связанный контент