
Cómo usar el comando de corte de Linux
2022-02-01

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.
El comando de corte
el cut
command es un veterano del mundo Unix, que 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 manera tradicional de UNIX, combinando cut
con otras utilidades como grep
puede crear soluciones elegantes y poderosas para problemas difíciles. Aunque hay diferentes versiones de cut
, vamos a discutir la versión estándar de GNU/Linux. Tenga en cuenta que otras versiones, en particular la cut
que se encuentran en las variantes de BSD, no incluyen 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 sido mejorada.
Primeros pasos Con corte
Si enviamos información a cut
o usando cut
para leer un archivo, los comandos que usamos son los mismos. Todo lo que puede hacer por un flujo de entrada con cut
se puede hacer en una línea de texto de un archivo, y viceversa. Podemos decir cut
para trabajar con bytes, caracteres o campos delimitados.
Para seleccionar un solo byte, usamos el -b
(byte) opción y decir cut
qué byte o bytes queremos. En este caso, es el byte cinco. Enviamos la cadena «how-to geek» en el cut
comando con una tubería, «|», de echo
.
echo 'how-to geek' | cut -b 5
El quinto byte de esta cadena es «t», por lo que cut
responde imprimiendo «t» en la ventana de la terminal.
Para especificar un intervalo usamos un guión. Para extraer los bytes del 5 al 11 inclusive, emitimos este comando:
echo 'how-to geek' | cut -b 5-11
Puede proporcionar múltiples bytes individuales o rangos separados por comas. Para extraer el byte 5 y el byte 11, use este comando:
echo 'how-to geek' | cut -b 5,11
Para obtener la primera letra de cada palabra, podemos usar este comando:
echo 'how-to geek' | cut -b 1,5,8
Si usa el guión sin primero número, cut
devuelve todo, desde la posición 1 hasta el número. Si usa el guión sin el 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-
Usar corte con caracteres
Utilizando cut
con caracteres es más o menos lo mismo que usarlo con bytes. En ambos casos, se debe prestar especial atención a los caracteres complejos. Al usar el -c
opción (carácter), decimos 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
Estos funcionan exactamente como cabría esperar. Pero mira este ejemplo. Es una palabra de seis letras, así que pregunta cut
para devolver los caracteres del uno al seis, devuelva la palabra completa. Pero no es el caso. Es un personaje 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
El problema es que el carácter «ñ» en realidad son dos bytes. Podemos ver esto muy fácilmente. Tenemos un archivo de texto corto que contiene esta línea de texto:
cat unicode.txt
Examinaremos este archivo con el hexdump
utilidad. Al usar el -C
(canónico) nos da una matriz 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 de ellos caracteres no imprimibles. Estos son los bytes resaltados en la matriz hexadecimal.
hexdump -C unicode.txt
Estos dos bytes son utilizados por el programa de visualización, 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 solicitamos el carácter 3 o el carácter 4, se 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
Usar corte con datos delimitados
Podemos preguntar cut
para dividir líneas de texto utilizando un delimitador especificado. Por defecto, cut 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 están referenciados como bytes o caracteres, pero están precedidos por el -f
(campos). Puede dejar un espacio entre la «f» y el número, o no.
El primer comando utiliza el -d
(delimitador) para decirle a cut que use «:» como delimitador. Extraerá el primer campo de cada línea del archivo «/etc/passwd». Esta será una lista larga, así que usamos head
con el -n
(número) 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
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
Incluyendo grep
en el comando, podemos buscar líneas que incluyan «/bin/bash». Esto significa que solo podemos enumerar las entradas que tienen Bash como shell predeterminado. Por lo general, serán las cuentas de usuario «normales». Pediremos los campos del uno al seis porque el séptimo campo es el campo de shell predeterminado y ya sabemos qué es, lo estamos buscando.
grep "/bin/bash" /etc/passwd | cut -d':' -f1-6
Otra forma de incluir todos los campos menos uno es usar el --complement
opción. Esto invierte la selección de campo y muestra cualquier no tiene sido preguntado Repitamos el último comando pero solo pidamos el campo 7. 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
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.
Corte de tubería En sección
Siguiendo con el archivo «/etc/passwd», extraiga 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 tiene subcampos separados por comas. Rara vez se completan, por lo que aparecen como una línea de comas.
Podemos eliminar las comas redirigiendo la salida del comando anterior a otra invocación de cut
. La segunda instancia de cut
utiliza la coma «,» como delimitador. el -s
(solo delimitado) la opción indica cut
para eliminar los resultados que no contienen ningún delimitador.
grep "/bin/bash" /etc/passwd | cut -d':' -s -f5 | cut -d',' -s -f1
Debido a que la entrada raíz no tiene subcampos de coma en el quinto campo, se elimina y obtenemos los resultados que buscamos: una lista de los nombres de los usuarios «reales» configurados en esta computadora.
EN RELACIÓN: ¿Cómo funcionan los permisos de archivos de Linux?
El delimitador de salida
Tenemos un pequeño archivo que contiene valores separados por comas. Los campos de estos datos ficticios son:
- identificador: Un número de identificación de la base de datos
- Ante todo: El primer nombre del sujeto.
- Ultimo: El apellido del sujeto.
- Correo electrónico: Su dirección de correo electrónico.
- dirección IP: Su dirección IP.
- Marca: La marca del vehículo de motor que conducen.
- Modelo: El modelo de vehículo de motor que conducen.
- Año: El año de fabricación de su vehículo de motor.
cat small.csv
Si le decimos a cut que use la coma como delimitador, podemos extraer los campos 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. Al usar el --output-delimiter
podemos decir qué personaje – o de hecho, qué 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=" "
El segundo comando dice cut
para reemplazar las comas con espacios.
Podemos llevar esto un paso 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 se use el carácter de nueva línea 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 del campo dos al 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=$''
Un Oldie pero Goldie
Al momento de escribir este artículo, el pequeño control de corte se acerca a su 40 aniversario, y todavía lo estamos usando y escribiendo sobre él hoy. Supongo que cortar texto hoy es lo mismo que hace 40 años. Es mucho más fácil cuando tienes la herramienta adecuada a mano.
EN RELACIÓN: 37 comandos importantes de Linux que debe conocer