nl: ¿Cómo empezar los números de línea en la segunda línea?

nl: ¿Cómo empezar los números de línea en la segunda línea?

Esta es la salida estándar 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:~$

En lugar de comenzar el número desde total 24, ¿sería posible comenzar desde el directorio/archivos reales, que es la segunda línea?

Salida deseada

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

Respuesta1

Consume la primera línea con algo más y pasa el resto anl

$ 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(con -upara deshabilitar el almacenamiento en búfer), consumirá una línea y quit, implícitamente imprimirá la línea antes de la terminación. nlconsume el resto de líneas.

Si realmente desea sangrar la primera línea, puede hacerlo así:

$ 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

Si desea comenzar la numeración de líneas más abajo, indique sedcuándo debe qaparecer:

$ 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

También puedes usar algo como /\.\.$/qen lugar de 3q.

Respuesta2

Esto hará que nlcomience desde 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

Respuesta3

Es un poco feo, pero al menos con la implementación de GNU Coreutils nlpuedes especificar las líneas que se numerarán mediante una expresión regular, ya que tno es uno de los tipos de archivos posibles en la lssalida de la lista larga.1Podrías hacerlo

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

Desafortunadamente, esto no preserva la alineación de salida.

Quizás el enfoque más formalmente correcto sea separar la lssalida en distintas secciones de encabezado y cuerpo:

$ 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

(de forma predeterminada, el estilo de numeración del encabezado esninguno).

Respuesta4

Podrías probarlo con awk:

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

Esto imprimirá la línea de "totales" sin numerarla, y todas las líneas restantes con números, ajustadas a la derecha, con un ancho de campo de 5. El espacio entre el número y el contenido de la línea será de dos espacios (el texto después de 5sen la printf()cadena de formato ); puedes reemplazarlo con algo más como \t.

Si no necesita la línea "totales", puede usar

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

o

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

en cambio.

información relacionada