lunes, 1 de agosto de 2016

cut

El programa cut se usa para extraer una sección de texto de una línea y pasar la sección extraída a la salida estándar. Puede aceptar múltiples argumentos de archivo o entradas de la entrada estándar.

Especificar la sección de la línea a extraer es un tanto incómodo y se especifica usando las siguientes opciones:

Tabla 20-3: Opciones de selección de cut
Opción Descripción
-c lista_de_caracteres Extrae la porción de línea definida por lista_de_caracteres. La lista puede consistir en uno o más rangos numéricos separados por comas.
-f lista_de_campos Extrae uno o más campos de la línea tal como se define en lista_de_campos. La lista puede contener uno o más campos o rangos de campos separados por comas.
-d carácter_delim Cuando especificamos -f, usamos carácter_delim como el carácter delimitador de campo. Por defecto, los campos deben estar separados por un carácter de tabulador.
--complement Extrae la línea de texto completa, excepto aquellas porciones especificadas por -c y/o -f.

Como podemos ver, la forma en que cut extrae el texto es más bien inflexible. cut se usa mejor para extraer texto de archivos que son producidos por otros programas, en lugar de texto escrito directamente por humanos. Echaremos un vistazo a nuestro archivo distros.txt para ver si está suficientemente "limpio" para ser un buen espécimen para nuestros ejemplos con cut. Si usamos cat con la opción -A, podemos ver si el archivo cumple nuestros requisitos de campos separados por tabuladores:

[me@linuxbox ~]$ cat -A distros.txt
SUSE^I10.2^I12/07/2006$
Fedora^I10^I11/25/2008$
SUSE^I11.0^I06/19/2008$
Ubuntu^I8.04^I04/24/2008$
Fedora^I8^I11/08/2007$
SUSE^I10.3^I10/04/2007$
Ubuntu^I6.10^I10/26/2006$
Fedora^I7^I05/31/2007$
Ubuntu^I7.10^I10/18/2007$
Ubuntu^I7.04^I04/19/2007$
SUSE^I10.1^I05/11/2006$
Fedora^I6^I10/24/2006$
Fedora^I9^I05/13/2008$
Ubuntu^I6.06^I06/01/2006$
Ubuntu^I8.10^I10/30/2008$
Fedora^I5^I03/20/2006$

Tiene buena pinta. Sin espacios intermedios, sólo caracteres de tabulador entre los campos. Como el archivo usa tabuladores en lugar de espacios, usaremos la opción -f para extraer un campo:

[me@linuxbox ~]$ cut -f 3 distros.txt
12/07/2006
11/25/2008
06/19/2008
04/24/2008
11/08/2007
10/04/2007
10/26/2006
05/31/2007
10/18/2007
04/19/2007
05/11/2006
10/24/2006
05/13/2008
06/01/2006
10/30/2008
03/20/2006

Como nuestro archivo distros está delimitado por tabuladores, es mejor usar cut para extraer campos en lugar de caracteres. Esto es porque cuando un archivo está delimitado por tabuladores, es muy improbable que cada línea contenga el mismo número de caracteres, lo que hace que calcular posiciones de caracteres dentro de la línea sea complicado o imposible. En nuestro ejemplo anterior, sin embargo, hemos extraído un campo que afortunadamente contiene datos de igual longitud, así que podemos mostrar como funciona la extracción de caracteres extrayendo el año de cada línea:

[me@linuxbox ~]$ cut -f 3 distros.txt | cut -c 7-10
2006
2008
2008
2008
2007
2007
2006
2007
2007
2007
2006
2006
2008
2006
2008
2006

Ejecutando cut una segunda vez en nuestra lista, podemos extraer las posiciones de caracteres de la 7 a la 10, que corresponden al año en nuestro campo fecha. La notación 7-10 es un ejemplo de rango. La man page de cut contiene una descripción completa de cómo pueden especificarse los rangos.

Cuando trabajamos con campos, es posible especificar un delimitador de campo diferente en lugar del carácter tabulador. Aquí extraeremos el primer campo del archivo /etc/passwd:

[me@linuxbox ~]$ cut -d ':' -f 1 /etc/passwd | head
root
daemon
bin
sys
sync
games
man
lp
mail
news

Usando la opción -d, podemos especificar el carácter dos puntos como carácter delimitador de campos.

No hay comentarios:

Publicar un comentario