Cómo usar el comando de corte de Linux

fatmawati achmad zaenuri / Shutterstock.com

linux cut El comando le permite extraer porciones de texto de archivos o flujos de datos. Es especialmente útil para trabajar con datos delimitados, como archivos CSV. Esto es lo que necesita saber.

Índice de contenidos
  1. El comando de corte
  2. Primeros pasos con el corte
  3. Usando el corte con personajes
  4. Usar corte con datos delimitados
  5. Tubería cortada por cizalla
  6. El delimitador de salida
  7. Un anciano pero Goldie

El comando de corte

El cut command es un veterano del mundo de Unix y debutó en 1982 como parte de AT&T System III UNIX. Su propósito en la vida es cortar secciones de texto de archivos o secuencias, de acuerdo con los criterios que establezca. Su sintaxis es tan simple como su propósito, pero es esta simplicidad conjunta lo que lo hace tan útil.

A la antigua manera de UNIX, combinando cut con otras utilidades como grep puede crear soluciones elegantes y poderosas para problemas difíciles. Si bien hay varias versiones del cut, hablaremos de la versión estándar de GNU/Linux. Tenga en cuenta que otras versiones, especialmente la cut que se encuentra en las variantes de BSD, no incluye todas las opciones descritas aquí.

Puede verificar qué versión está instalada en su computadora ejecutando este comando:

cut --version

Si ve "GNU coreutils" en el resultado, está en la versión que describiremos en este artículo. Todas las versiones de cut tienen algunas de estas características, pero la versión de Linux ha agregado mejoras.

Primeros pasos con el corte

Si estamos ingresando información cut o usando cut para leer un archivo, los comandos que usamos son los mismos. Cualquier cosa que puedas hacer con un flujo de entrada cut se puede hacer en una línea de texto de un archivo, y al revés. Podemos decir cut para trabajar con bytes, caracteres o campos delimitados.

Para seleccionar un solo byte, usamos el -b (byte) opción y decirlo cut qué byte o byte queremos. En este caso, es el byte cinco. Estamos enviando la cadena "how-to geek" en el archivo cut comando con una tubería, “|”, de echo .

echo 'how-to geek' | cut -b 5

Extrayendo un solo byte con corte

El quinto byte en esa cadena es "t", entonces cut responde imprimiendo "t" en la ventana de terminal.

Para especificar un rango usamos un guión. Para extraer los bytes del 5 al 11 inclusive, emitiremos este comando:

echo 'how-to geek' | cut -b 5-11

Extrayendo un rango de bytes con corte

Puede proporcionar múltiples bytes individuales o rangos separándolos con comas. Para extraer el byte 5 y el byte 11, use este comando:

echo 'how-to geek' | cut -b 5,11

Extracción de dos bytes con corte

Para obtener la primera letra de cada palabra podemos usar este comando:

echo 'how-to geek' | cut -b 1,5,8

Extracción de tres bytes con corte

Si usa el guión sin un primero número, cut devuelve todo, desde la posición 1 hasta el número. Si usa el guión sin un segundo número, cut devuelve todo, desde el primer número hasta el final de la secuencia o línea.

echo 'how-to geek' | cut -b -6
echo 'how-to geek' | cut -b 8-

Extracción de rango de bytes con recorte

Usando el corte con personajes

Utilizando cut con caracteres es muy parecido a usarlo con bytes. En ambos casos, se debe prestar especial atención a los caracteres complejos. Utilizando el -c (personaje), digamos cut funcionan en términos de caracteres, no de bytes.

echo 'how-to geek' | cut -c 1,5,8
echo 'how-to geek' | cut -c 8-11

Extracción de caracteres y rangos de caracteres con corte

Estos funcionan exactamente como cabría esperar. Pero mira este ejemplo. Es una palabra de seis letras, así que pregunto cut para devolver los caracteres del uno al seis, debe devolver la palabra completa. Pero no es así. Es un carácter corto. Para ver la palabra completa necesitamos preguntar por los caracteres del uno al siete.

echo 'piñata' | cut -c 1-6
echo 'piñata' | cut -c 1-7

Los caracteres especiales pueden ocupar más de un carácter

El problema es que el carácter "ñ" en realidad son dos bytes. Podemos verlo con bastante facilidad. Tenemos un archivo de texto corto que contiene esta línea de texto:

cat unicode.txt

El contenido del archivo de texto breve

Examinaremos ese archivo con el hexdump utilidad. Utilizando el -C La opción (canónica) proporciona una tabla de dígitos hexadecimales con el equivalente ASCII a la derecha. En la tabla ASCII no se muestra la “ñ”, sino que hay puntos que representan Dos caracteres no imprimibles. Estos son los bytes resaltados en la tabla hexadecimal.

hexdump -C unicode.txt

Archivo de texto de prueba hexdump

Estos dos bytes son utilizados por el espectador, en este caso el shell Bash, para identificar la "ñ". Muchos caracteres Unicode usan tres o más bytes para representar un solo carácter.

Si pedimos el carácter 3 o el carácter 4 se nos muestra el símbolo de un carácter no imprimible. Si pedimos 3 bytes Y 4, la concha los interpreta como "ñ".

echo 'piñata' | cut -c 3
echo 'piñata' | cut -c 4
echo 'piñata' | cut -c 3-4

Uso del corte para extraer los caracteres que componen un carácter especial

Usar corte con datos delimitados

Podemos preguntar cut para dividir líneas de texto utilizando un delimitador especificado. De forma predeterminada, el corte usa un carácter de tabulación, pero es fácil decirle que use lo que queramos. Los campos en el archivo "/etc/passwd" están separados por dos puntos ":", por lo que lo usaremos como delimitador y extraeremos algo de texto.

Las porciones de texto entre los delimitadores se llaman camposy son referenciados como bytes o caracteres, pero están precedidos por -f (campos) opción. Puede dejar un espacio entre la "f" y el dígito, o no.

El primer comando utiliza el -d (delimitador) opción para indicar al cortar usar “:” como delimitador. Extraiga el primer campo de cada línea en el archivo "/etc/passwd". Será una lista larga, por lo que estamos usando head con el -n (número) opción para mostrar solo las primeras cinco respuestas. El segundo comando hace lo mismo pero usa tail para mostrarnos las últimas cinco respuestas.

cut -d':' -f1 /etc/passwd | head -n 5
cut -d':' -f2 /etc/passwd | tail -n 5

Extraer un rango de campos del archivo /etc/passwd

Para extraer una selección de campos, enumérelos como una lista separada por comas. Este comando extraerá los campos del uno al tres, cinco y seis.

cut -d':' -f1-3,5,6 /etc/passwd | tail -n 5

Extraer un rango de campos del archivo /etc/passwd

Incluso grep en el comando, podemos buscar líneas que incluyan "/bin/bash". Esto significa que solo podemos enumerar aquellas entradas que tienen Bash como shell predeterminado. Por lo general, serán cuentas de usuario "normales". Le pediremos los campos del uno al seis porque el séptimo campo es el campo de shell predeterminado y ya sabemos cuál es, lo estamos buscando.

grep "/bin/bash" /etc/passwd | cut -d':' -f1-6

Extraiga los campos del uno al seis del archivo /etc/passwd

Otra forma de incluir todos menos uno de los campos es usar el --complement opción. Esto invierte la selección del campo y muestra este ella no ha sido solicitado. Repetimos el último comando pero solo pedimos el campo siete. Luego ejecutaremos ese comando nuevamente con el --complement opción.

grep "/bin/bash" /etc/passwd | cut -d':' -f7
grep "/bin/bash" /etc/passwd | cut -d':' -f7 --complement

Uso de la opción --complement para invertir la selección de un campo

El primer comando encuentra una lista de entradas, pero el campo siete no nos da nada para diferenciarlas, por lo que no sabemos a quién se refieren las entradas. En el segundo comando, agregando el --complement opción obtenemos todo excepto el campo siete.

Tubería cortada por cizalla

Quedándonos con el archivo "/etc/passwd", extraigamos el campo cinco. Este es el nombre real del usuario propietario de la cuenta de usuario.

grep "/bin/bash" /etc/passwd | cut -d':' -f5

El quinto campo del archivo /etc/passwd puede tener subcampos separados por comas

El quinto campo tiene subcampos separados por comas. Rara vez se completan, por lo que aparecen como una fila de comas.

Podemos eliminar las comas insertando la salida del comando anterior en otra invocación de cut . La segunda instancia de cut utilice la coma “,” como delimitador. El -s (solo delimitado) la opción dice cut para suprimir los resultados que no contienen el delimitador en absoluto.

grep "/bin/bash" /etc/passwd | cut -d':' -s -f5 | cut -d',' -s -f1

Tubo corte a corte para tratar dos tipos de delimitador

Dado que la entrada raíz no tiene subcampos de coma en el quinto campo, se suprime y obtenemos los resultados que buscamos: una lista de los nombres de usuario "reales" configurados en esta computadora.

RELACIONADO: ¿Cómo funcionan los permisos de archivos de Linux?

El delimitador de salida

Tenemos un pequeño archivo con algunos valores separados por comas en ellos. Los campos en estos datos ficticios son:

  • IDENTIFICACIÓN: un número de identificación de la base de datos
  • Primero: El nombre del sujeto.
  • Ultimo: El apellido del sujeto.
  • Email: Su dirección de correo electrónico.
  • dirección IP: Su dirección IP.
  • Marca: La marca del vehículo de motor que conducen.
  • Plantilla: El modelo del vehículo de motor que conducen.
  • Año: El año en que se fabricó su vehículo de motor.
cat small.csv

Un archivo de texto de datos CSV ficticios

Si le decimos a cut que use la coma como delimitador, podemos extraer los campos tal como lo hicimos antes. A veces, necesita extraer datos de un archivo, pero no desea que el delimitador de campo se incluya en los resultados. Utilizando el --output-delimiter podemos decirle al corte qué personaje, o de hecho, personaje secuencia: se utilizará en lugar del delimitador real.

cut -d ',' -f 2,3 small.csv
cut -d ',' -f 2,3 small.csv --output-delimiter=" "

Usando --output-delimiter para cambiar el delimitador en los resultados

El segundo comando dice cut para reemplazar las comas con espacios.

Podemos ir más allá y usar esta función para convertir la salida en una lista vertical. Este comando utiliza un carácter de nueva línea como delimitador de salida. Tenga en cuenta el "$" que debemos incluir para que el carácter de nueva línea actúe y no se interprete como una secuencia literal de dos caracteres.

Usaremos grep para filtrar la entrada de Morgana Renwick y preguntar cut para imprimir todos los campos desde el campo dos hasta el final del registro y para usar un carácter de nueva línea como delimitador de salida.

grep 'renwick' small.csv | cut -d ',' -f2- --output-delimiter=$''

Convertir un registro en una lista utilizando un carácter de nueva línea como delimitador de salida

Un anciano pero Goldie

Al momento de escribir este artículo, el comando de recorte pequeño se acerca a su 40 cumpleaños y todavía lo estamos usando y escribiendo sobre él hoy. Supongo que cortar el texto hoy es el mismo que hace 40 años. Es decir, mucho más fácil cuando se tiene a mano la herramienta adecuada.

RELACIONADO: 37 comandos importantes de Linux que debes conocer

Descubre más contenido

Subir Change privacy settings