Comando nl de Linux: numeración de líneas

LinuxBeginner
Practicar Ahora

Introducción

En este tutorial exploraremos el comando nl de Linux, que permite numerar las líneas de los archivos de texto. Aprenderemos a utilizarlo en distintas situaciones para facilitar la referencia a líneas concretas de un documento. Esta habilidad resulta especialmente útil para programadores, administradores de sistemas y cualquier persona que trabaje habitualmente con archivos de texto.

Imagina que eres un desarrollador de software junior y estás trabajando en tu primer proyecto importante. El responsable de tu equipo te ha pedido revisar un archivo de configuración y comentar algunas secciones concretas. El comando nl te permitirá localizar y mencionar fácilmente líneas específicas del archivo, haciendo que la colaboración sea más eficaz.

Comprender el comando nl básico

En este paso examinarás un archivo de configuración de ejemplo mediante el comando nl.

Primero, accede al directorio del proyecto. Escribe el siguiente comando y pulsa Intro:

cd /home/labex/project

Este comando cambia el directorio actual a /home/labex/project, donde se encuentran nuestros archivos de ejemplo.

Ahora utiliza el comando nl para mostrar el contenido de config.txt con los números de línea. Escribe:

nl config.txt | tee nl-basic.txt

Deberías ver una salida similar a esta:

     1  ## Server Configuration
     2  port=8080
     3  max_connections=100
     4
     5  ## Database Settings
     6  db_host=localhost
     7  db_port=5432
     8  db_name=myapp
     ...

Veamos qué sucede:

  • El comando nl ha añadido los números de línea a la izquierda de cada línea del archivo.
  • Observa que los números están alineados a la derecha en una columna de 6 caracteres de ancho.
  • La línea en blanco (la línea 4 del archivo original) no se numera de forma predeterminada.
  • El comando tee muestra la salida y también la guarda en nl-basic.txt.

Esta numeración facilita la referencia a líneas concretas al comentar el archivo con tus compañeros. Por ejemplo, podrías decir: «Veamos la línea 2 para comprobar el número de puerto».

Si no aparece esta salida o se produce un error, asegúrate de encontrarte en el directorio correcto (/home/labex/project) y de que exista el archivo config.txt. Puedes comprobarlo utilizando el comando ls para listar los archivos del directorio actual.

Numerar todas las líneas, incluidas las líneas en blanco

En este paso numerarás todas las líneas, incluidas las líneas en blanco. Esto resulta útil cuando necesitas hacer referencia a líneas vacías o cuando trabajas con archivos en los que las líneas en blanco tienen importancia. Para ello utilizaremos la opción -b a.

Ejecuta el siguiente comando:

nl -b a config.txt | tee nl-all-lines.txt

Ahora deberías ver una salida similar a esta:

     1  ## Server Configuration
     2  port=8080
     3  max_connections=100
     4
     5  ## Database Settings
     6  db_host=localhost
     7  db_port=5432
     8  db_name=myapp
     ...

Esto es lo que ocurre:

  • La opción -b controla la numeración de las líneas del cuerpo del archivo.
  • El argumento a significa «todas» e indica a nl que numere todas las líneas, incluidas las vacías.
  • Observa que la línea 4, que antes estaba vacía y no tenía número, ahora sí está numerada.
  • tee muestra la salida y la guarda en nl-all-lines.txt.

Esta función es especialmente útil cuando necesitas mencionar líneas vacías en una explicación o cuando trabajas con archivos en los que las líneas en blanco tienen un significado concreto, como ocurre en algunos lenguajes de programación o archivos de configuración.

Si la línea en blanco no aparece numerada, comprueba que hayas incluido la opción -b a en el comando.

Personalizar el formato de los números

En este paso personalizarás la forma en que se muestran los números de línea. Esto puede mejorar la legibilidad o preparar la salida para procesarla posteriormente. Vamos a alinear los números a la derecha y añadir ceros iniciales.

Utiliza la opción -n rz:

nl -n rz config.txt | tee nl-zero-padded.txt

La salida debería tener este aspecto:

000001  ## Server Configuration
000002  port=8080
000003  max_connections=100

000004  ## Database Settings
000005  db_host=localhost
000006  db_port=5432
000007  db_name=myapp

000008  ### Logging Configuration
000009  log_level=info
000010  log_file=/var/log/myapp.log

000011  ## Security Settings
000012  enable_ssl=true
000013  ssl_cert_path=/etc/ssl/certs/myapp.crt

000014  ### Performance Tuning
000015  cache_size=1024
000016  thread_pool=20

000017  ## Miscellaneous
000018  debug_mode=false

Desglosemos la opción -n rz:

  • -n permite especificar el formato de numeración.
  • r significa alineación a la derecha, que de hecho es el comportamiento predeterminado.
  • z indica que se deben añadir ceros iniciales.
  • tee muestra la salida y la guarda en nl-zero-padded.txt.

Este formato resulta especialmente útil cuando necesitas ordenar o procesar la salida con otros comandos, ya que el ancho fijo garantiza una alineación uniforme.

Si la salida no coincide con la mostrada, asegúrate de haber escrito correctamente el comando, incluida la opción -n rz.

Numerar tipos de líneas específicos

En este paso utilizarás nl para numerar únicamente determinados tipos de líneas. Esto resulta muy práctico al trabajar con archivos complejos en los que quieres centrarte en líneas concretas. Numeraremos solo las líneas no vacías que no comiencen por el carácter #, utilizado habitualmente para los comentarios en los archivos de configuración.

Utiliza el siguiente comando:

nl -b p'^[^#]' config.txt | tee nl-settings-only.txt

Deberías ver una salida similar a esta:

       ## Server Configuration
     1  port=8080
     2  max_connections=100

       ## Database Settings
     3  db_host=localhost
     4  db_port=5432
     5  db_name=myapp

       ### Logging Configuration
     6  log_level=info
     7  log_file=/var/log/myapp.log

       ## Security Settings
     8  enable_ssl=true
     9  ssl_cert_path=/etc/ssl/certs/myapp.crt

       ### Performance Tuning
    10  cache_size=1024
    11  thread_pool=20

       ## Miscellaneous
    12  debug_mode=false

Analicemos este comando más complejo:

  • -b p indica a nl que numere únicamente las líneas que coincidan con un patrón específico.
  • '^[^#]' es un patrón de expresión regular:
    • ^ significa «inicio de la línea».
    • [^#] significa «cualquier carácter que no sea #».
    • Por tanto, el patrón completo coincide con cualquier línea que no comience por #.
  • tee muestra la salida y la guarda en nl-settings-only.txt.

Este comando resulta útil cuando quieres centrarte en las líneas activas de configuración e ignorar los comentarios. Es especialmente práctico en archivos de configuración grandes, ya que permite identificar y referenciar rápidamente los ajustes efectivos.

Si la salida no es la esperada, comprueba que hayas escrito el comando exactamente como se muestra, incluidas las comillas simples que rodean el patrón.

Combinar opciones para crear una numeración compleja

En este paso combinarás varias opciones de nl para crear un esquema de numeración más elaborado. Numerarás todas las líneas, utilizarás un formato personalizado y establecerás el ancho del campo numérico.

Ejecuta el siguiente comando:

nl -b a -n rz -s ': ' -w 3 config.txt | tee nl-combined.txt

Este comando realiza las siguientes acciones:

  • -b a: numera todas las líneas, incluidas las líneas en blanco.
  • -n rz: alinea los números a la derecha y añade ceros iniciales.
  • -s ': ': utiliza : como separador entre el número y el contenido de la línea.
  • -w 3: establece en 3 caracteres el ancho del campo numérico.

Deberías ver una salida similar a esta:

001: ## Server Configuration
002: port=8080
003: max_connections=100
004:
005: ## Database Settings
006: db_host=localhost
007: db_port=5432
008: db_name=myapp
009:
010: ### Logging Configuration
011: log_level=info
012: log_file=/var/log/myapp.log
013:
014: ## Security Settings
015: enable_ssl=true
016: ssl_cert_path=/etc/ssl/certs/myapp.crt
017:
018: ### Performance Tuning
019: cache_size=1024
020: thread_pool=20
021:
022: ## Miscellaneous
023: debug_mode=false

Veamos qué sucede:

  • Se numeran todas las líneas, incluidas las vacías.
  • Los números se alinean a la derecha y llevan ceros iniciales.
  • El separador entre el número y el contenido de la línea es : .
  • El ancho del campo numérico se establece en 3 caracteres.
  • La salida mostrada se guarda en nl-combined.txt.

Este esquema de numeración puede ser muy útil al trabajar con archivos de configuración estructurados o documentos divididos en secciones. Permite hacer referencia fácilmente a las líneas de cada sección.

Si la salida no coincide exactamente, revisa con atención el comando introducido, prestando especial atención a los espacios y los caracteres especiales.

Resumen

En este tutorial hemos explorado el comando nl y sus distintas opciones para numerar las líneas de archivos de texto. Hemos aprendido a:

  1. Utilizar el comando nl básico para añadir números de línea a un archivo.
  2. Numerar todas las líneas, incluidas las vacías, mediante la opción -b a.
  3. Personalizar el formato de los números con la opción -n rz.
  4. Numerar tipos de líneas específicos mediante patrones de coincidencia.
  5. Combinar varias opciones para crear esquemas de numeración complejos.

Estas habilidades te ayudarán a desplazarte por archivos de configuración, código fuente y otros archivos de texto, así como a hacer referencia a sus líneas durante tus proyectos de desarrollo.

Entre las opciones adicionales del comando nl que no se han tratado en este tutorial se incluyen:

  • -v NUM: comienza la numeración en NUM en lugar de 1.
  • -i NUM: incrementa los números en NUM en lugar de 1.
  • -l NUM: agrupa NUM líneas y numera únicamente la primera línea de cada grupo.
  • -f a: numera todas las líneas de encabezado, es decir, las líneas anteriores a la primera línea del cuerpo.

Estas opciones ofrecen aún más flexibilidad al trabajar con el comando nl.