viernes, 2 de septiembre de 2016

nl - Numera líneas

El programa nl es una herramienta más bien arcana que se usa para realizar una tarea simple. Numera las líneas. En su uso más simple, se parece a cat -n:

[me@linuxbox ~]$ nl distros.txt | head
 1 SUSE   10.2 12/07/2006
 2 Fedora 10   11/25/2008
 3 SUSE   11.0 06/19/2008
 4 Ubuntu 8.04 04/24/2008
 5 Fedora 8    11/08/2007
 6 SUSE   10.3 10/04/2007
 7 Ubuntu 6.10 10/26/2006
 8 Fedora 7    05/31/2007
 9 Ubuntu 7.10 10/18/2007
10 Ubuntu 7.04 04/19/2007

Como cat, nl puede aceptar tanto múltiples archivos como argumentos de línea de comandos, o entrada estándar. Sin embargo, nl tiene varias opciones y soporta una forma primitiva de etiquetas para permitir tipos de numeración más complejos.

nl soporta un concepto llamado "páginas lógicas" cuando numera. Esto permite a nl resetear (empezar de nuevo) la secuencia numérica cuando está numerando. Usando opciones, es posible establecer el número inicial a un valor específico y, en cierta medida, su formato. Una página lógica está dividida en encabezado, cuerpo y pie de página. Dentro de cada una de estas secciones, el numerado de líneas puede ser reseteado y/o asignarle un estilo diferente. Si le damos a nl múltiples archivos, los trata como una sola secuencia de texto. Las secciones en la secuencia de texto se indican con la presencia de algún tipo de etiqueta, bastante extraña, añadida al texto:

Tabla 21-1: Etiquetas nl
Etiqueta Significado
\:\:\: Comienzo del encabezado de la página lógica
\:\: Comienzo del cuerpo de la página lógica
\: Comienzo del pie de página de la página lógica

Cada etiqueta anterior debe aparecer sola en su propia línea. Tras procesar una etiqueta, nl la borra de la cadena de texto.

Aquí tenemos las opciones comunes de nl:

Tabla 21-2: Opciones comunes de nl
Opción Significado
-b style Establece la numeración del cuerpo a style, donde style es uno de los siguientes:
a = numera todas las líneas
t = numera sólo las líneas que no están en blanco. Es la opción por defecto.
n = ninguna línea.
pregexp = numera sólo las líneas que coinciden con la expresión regular básica regexp.
-f style Establece la numeración del pie a style. La opción por defecto es n (ninguna).
-h style Establece la numeración del encabezado a style. La opción por defecto es n (ninguna).
-i number Establece el incremento de numeración por página a number. La opción por defecto es uno.
-n format Establece el formato de numeración a format, donde format es:
ln = justificado a la izquierda, sin ceros delante.
rn = justificado a la derecha, sin ceros delante. Es la opción por defecto.
rz = justificado a la derecha, con ceros delante.
-p No resetea la numeración de páginas al principio de cada página lógica.
-s string Añade string al final de cada número de línea para crear un separador. La opción por defecto solamente es un carácter de tabulación.
-v number Establece el número de la primera línea de cada página lógica a number. La opción por defecto es uno.
-w width Establece la anchura del campo del número de línea a width. La opción por defecto es 6.

Admitámoslo, probablemente no querremos numerar líneas tan a menudo, pero podemos usar nl para ver cómo podemos combinar múltiples herramientas para realizar tareas más complejas. Trabajaremos sobre nuestro ejercicio del capítulo anterior para producir un informe de distribuciones Linux. Como usaremos nl, será útil incluir sus etiquetas encabezado/cuerpo/pie de página. Para hacerlo, las añadiremos al script sed del último capítulo. Usando nuestro editor de texto, cambiaremos el script de la siguiente forma y lo guardaremos como distros-nl.sed:

# sed script to produce Linux distributions report

1 i\
\\:\\:\\:\
\
Linux Distributions Report\
\
Name Ver. Released\
---- ---- --------\
\\:\\:
s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/
$ a\
\\:\
\
End Of Report

El script ahora inserta las etiquetas de páginas lógicas de nl y añade un pie de página al final del informe. Fíjate que hemos tenido que duplicar las barras invertidas en nuestras etiquetas, porque normalmente se interpretan como un carácter de escape en sed.

A continuación, produciremos nuestro informe mejorado combinando sort, sed y nl:

[me@linuxbox ~]$ sort -k 1,1 -k 2n distros.txt | sed -f distros-nl.sed | nl

 Linux Distributions Report
   
   Name   Ver. Released
   ----   ---- --------
 1 Fedora 5    2006-03-20
 2 Fedora 6    2006-10-24
 3 Fedora 7    2007-05-31
 4 Fedora 8    2007-11-08
 5 Fedora 9    2008-05-13
 6 Fedora 10   2008-11-25
 7 SUSE   10.1 2006-05-11
 8 SUSE   10.2 2006-12-07
 9 SUSE   10.3 2007-10-04
10 SUSE   11.0 2008-06-19
11 Ubuntu 6.06 2006-06-01
12 Ubuntu 6.10 2006-10-26
13 Ubuntu 7.04 2007-04-19
14 Ubuntu 7.10 2007-10-18
15 Ubuntu 8.04 2008-04-24
16 Ubuntu 8.10 2008-10-30


   End Of Report

Nuestro informe es el resultado de nuestra tubería de comandos. Primero, ordenamos la lista por nombre de la distribución y versión (campos 1 y 2), luego procesamos el resultado con sed, añadiendo el encabezado del informe (incluyendo la etiqueta de página lógica de nl) y el pie de página. Finalmente, procesamos el resultado con nl, que, por defecto, sólo numera las líneas de la secuencia de texto que pertenezcan a la sección del cuerpo de la página lógica.

Podemos repetir el comando y experimentar con diferentes opciones de nl. Algunas interesantes son:

nl -n rz

y

nl -w 3 -s ' '

No hay comentarios:

Publicar un comentario