Saltar la navegación

cut

El comando cut es usado para la extracción de porciones de las lineas de texto, provenientes de uno o varios ficheros o bien de la entrada estándar. La información seleccionada la envía a la salida estándar.

La sintaxis general es:

cut  [opción...]  [fichero...]

Al igual que con el filtro sort se puede poner un - entre los nombres de ficheros y procesar también la entrada estándar. En el caso de que no se especifique ningún fichero se leerá de la entrada estándar.

La orden cut puede trabajar utilizando caracteres o campos, y para especificar la lista de estos podemos combinar los siguientes formatos separándolos con comas:

  • N para indicar el enésimo carácter o campo.
  • N- para indicar desde el enésimo carácter o campo hasta el final de la línea.
  • N-M para indicar desde el enésimo carácter o campo hasta el emésimo.
  • -N para indicar desde el inicio de la línea hasta el enésimo carácter o campo.

Para trabajar a nivel de carácter usaremos la opción -c. En el siguiente ejemplo se seleccionan los permisos de los ficheros:

$ ls -l
total 60
-rw-r--r-- 1 usuario vboxsf 25969 sep  7 13:10 f1.txt
-rw-r--r-- 1 usuario vboxsf 20981 sep  7 13:10 f2.txt
-rw-r--r-- 1 usuario vboxsf    49 sep  7 13:10 f3.txt
-rw-r--r-- 1 usuario vboxsf    48 sep  7 13:10 f4.txt
$ ls -l | tail -n +2 | cut -c 2-10
rw-r--r--
rw-r--r--
rw-r--r--
rw-r--r--

Si queremos seleccionar por campos, hay que especificar el delimitador de campos con la opción -d y la lista de campos con -f. En el siguiente ejemplo se seleccionan el contador de enlaces duros de los ficheros y sus nombres, para lo que se ha eliminado la línea del total (tail) y las secuencias de espacios para dejar solo uno (tr), de esta forma todas las líneas tienen el mismo número de campos separados por un espacio.

$ ls -l
total 60
-rw-r--r-- 1 usuario vboxsf 25969 sep  7 13:10 f1.txt
-rw-r--r-- 1 usuario vboxsf 20981 sep  7 13:10 f2.txt
-rw-r--r-- 1 usuario vboxsf    49 sep  7 13:10 f3.txt
-rw-r--r-- 1 usuario vboxsf    48 sep  7 13:10 f4.txt
$ ls -l | tail -n +2 | tr -s ' ' | cut -d ' ' -f 2,9
1 f1.txt
1 f2.txt
1 f3.txt
1 f4.txt

El separador de los distintos trozos de información de salida lo podemos indicar con la opción --output-delimiter.

$ ls -l | tail -n +2 | tr -s ' ' | cut -d ' ' -f 2,9 --output-delimiter=" enlaces duros tiene el fichero "
1 enlaces duros tiene el fichero f1.txt
1 enlaces duros tiene el fichero f2.txt
1 enlaces duros tiene el fichero f3.txt
1 enlaces duros tiene el fichero f4.txt

Si una línea no tuviera el delimitador, esta aparecerá completa en la salida, y si esto no nos interesa, la eliminamos con la opción -s. En el ejemplo siguiente pretendemos extraer los minutos de la hora de los ficheros, y para eliminar las líneas que no tengan el separador usamos la opción -s, esto último solo ocurre con la línea del total. El ejemplo se muestra paso a paso, que es la forma de construir las tuberías:

$ ls -l
total 60
-rw-r--r-- 1 usuario vboxsf 25969 sep  7 13:10 f1.txt
-rw-r--r-- 1 usuario vboxsf 20981 sep  7 13:10 f2.txt
-rw-r--r-- 1 usuario vboxsf    49 sep  7 13:10 f3.txt
-rw-r--r-- 1 usuario vboxsf    48 sep  7 13:10 f4.txt
$ ls -l | cut -d : -f 2
total 60
10 f1.txt
10 f2.txt
10 f3.txt
10 f4.txt
$ ls -l | cut -sd : -f 2
10 f1.txt
10 f2.txt
10 f3.txt
10 f4.txt
$ ls -l | cut -sd : -f 2 | cut -d ' ' -f 1
10
10
10
10

A veces es más fácil decir los campos que no queremos que los que queremos, y para estos casos tenemos la opción --complement que muestra todo aquello distinto a lo especificado. Por ejemplo, para mostrar todo menos los permisos:

$ ls -l | tail -n +2 | cut -c 2-10 --complement
- 1 usuario vboxsf 25969 sep  7 13:10 f1.txt
- 1 usuario vboxsf 20981 sep  7 13:10 f2.txt
- 1 usuario vboxsf    49 sep  7 13:10 f3.txt
- 1 usuario vboxsf    48 sep  7 13:10 f4.txt

 

Licencia: licencia de software libre GPL