nl: Como iniciar os números das linhas na segunda linha?

nl: Como iniciar os números das linhas na segunda linha?

Esta é a saída padrão dels -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:~$

Em vez de iniciar o número em total 24, seria possível iniciá-lo a partir dos arquivos/diretórios reais, que são a segunda linha?

Saída desejada

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

Responder1

Consumir a primeira linha com outra coisa e passar o resto paranl

$ 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(com -upara desabilitar o buffer), consumirá uma linha e qsairá, imprimindo implicitamente a linha antes do término. nlconsome o resto das linhas.

Se você realmente deseja que a primeira linha seja recuada, você pode fazer assim:

$ 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

Caso queira iniciar a numeração das linhas mais abaixo, diga sedquando qusar:

$ 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

Você também pode usar algo como /\.\.$/qem vez de 3q.

Responder2

Isso fará com que nlcomece do 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

Responder3

É meio feio, mas pelo menos com a implementação do GNU Coreutils nlvocê pode especificar as linhas a serem numeradas por meio de uma expressão regular - já que tnão é um dos tipos de arquivo possíveis na lssaída da lista longa1você poderia fazer

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

Infelizmente, isso não preserva o alinhamento da saída.

Talvez a abordagem formalmente mais correta seja separar a lssaída em seções distintas de cabeçalho e corpo:

$ 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

(por padrão, o estilo de numeração do cabeçalho énenhum).

Responder4

Você poderia tentar com awk:

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

Isto irá imprimir a linha "totais" sem numerá-la, e todas as linhas restantes com números, ajustadas à direita, com uma largura de campo de 5. O espaço entre o número e o conteúdo da linha será de dois espaços (o texto após o 5sna printf()string de formato ); você pode substituí-lo por algo como \t.

Se você não precisa da linha "totais", você pode usar

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

ou

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

em vez de.

informação relacionada