¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Programación shell en Unix/Linux
  3. Los comandos filtro
Extrait - Programación shell en Unix/Linux ksh, bash, estándar POSIX (con ejercicios corregidos) (5ª edición)
Extractos del libro
Programación shell en Unix/Linux ksh, bash, estándar POSIX (con ejercicios corregidos) (5ª edición) Volver a la página de compra del libro

Los comandos filtro

Presentación

Este capítulo presenta los principales comandos filtro de Unix. Estos comandos tratan un flujo de datos de la entrada estándar o contenidos en un archivo. Pueden usarse de forma independiente o situados detrás de una tubería de comunicaciones. Los filtros se utilizan en la mayoría de los casos del mismo modo (aunque puede haber excepciones). Las principales opciones de cada comando se presentarán en este capítulo.

Sintaxis de llamada a comandos filtro

comando_filtro  -opciones  arch1  arch2 ... 
comando_filtro  -opciones  - 
comando_filtro  -opciones  < archivo 
comando | commando_filtro  -opciones 

Visualización de datos

1. Consulta de datos, creación de archivos: cat

Junto con la visualización de archivos, a continuación se muestran otros ejemplos de uso del comando cat.

Sintaxis

cat [ opciones ] [ archivo ... ] 

Principales opciones:

-e

Materializa los finales de línea con un carácter $.

-t

Materializa las tabulaciones con un carácter ˆI.

-v

Materializa los caracteres no imprimibles.

Ejemplos

Cuando el comando cat no recibe un archivo como argumento, lee de la entrada estándar (teclado). En este caso, los datos leídos del teclado se redirigen al archivo f1, lo que tiene como efecto la creación del archivo si este no existe o su sobrescritura si existe.

$ cat > f1 
Línea1 
Línea2 
^d  
$ cat f1 
Línea1 
Línea2 

El archivo f3 es la concatenación de f1 y f2:

$ cat f1  
Línea1 
Línea2 
$ cat f2  
Línea3 
Línea4 
$ cat f1 f2 > f3 
 
$ cat f3  
Línea1 
Línea2 
Línea3 
Línea4 

La opción -t permite visualizar las tabulaciones. Estas se materializan con el carácter ˆI:

$ cat f4 
palabra1    palabra2 
$ cat -t f4 
palabra1ˆIpalabra2 

La opción -e permite visualizar los finales de línea. Estos aparecen con la forma del carácter $:

$ cat -e f4 
palabra1    palabra2$ 
$ 

La opción -v permite mostrar de forma visible los caracteres no imprimibles. Un ejemplo de uso se pudo ver en el capítulo Configuración del entorno de trabajo - Histórico de comandos, que hacía referencia a la reutilización de un comando en ksh.

Mostrar los alias permitiendo usar el recordatorio de comandos con las flechas del teclado:

$ alias | cat -v 
__A=ˆP 
__B=ˆN 
__C=ˆF 
__D=ˆB 
... 
$ 

2. Valor de los bytes de un flujo de datos: od

El comando od permite visualizar el valor de cada byte de un archivo de texto o binario. La opción -c permite solicitar una interpretación byte a byte. Así es posible visualizar de manera exacta el contenido del archivo, detectar la colocación de espacios, tabulaciones y saltos de línea (CR LF o LF), etc.

Ejemplos

El comando cat no nos permite saber si el archivo contiene espacios o tabulaciones. Con...

Tratamiento de datos

1. Recuento de líneas, de palabras y caracteres: wc

El comando wc (word count) cuenta el número de líneas, de palabras y de caracteres. 

Sintaxis

wc   [ opciones ]    [ archivo ... ] 

Principales opciones:

-l

Contar el número de líneas.

-w

Contar el número de palabras.

-c

Contar el número de bytes.

-m

Contar el número de caracteres.

Ejemplos

Número de líneas, palabras y caracteres del archivo notas.txt:

$ wc notas.txt 
    5     15     245 notas.txt 

Número de líneas únicamente:

$ wc -l notas.txt 
     5 notas.txt 

Número de caracteres contenidos en un nombre de archivo introducido mediante el teclado (atención al salto de línea añadido por el comando echo):

$ read nombrearch 
documento.xls 
ˆd 
$ echo "$nombrearch\c" | wc -c     #Linux: $ echo -n "$nombrearch"
| wc -c  
13 
$ 

A continuación se muestra un archivo codificado en UTF-8 (los caracteres acentuados y la letra ñ se codifican en 2 bytes), manipulado en un sistema cuya codificación es también UTF-8:

$ echo $LANG 
es_ES.utf8 

El archivo contiene 1 carácter acentuado y la letra ñ:

$ cat utf8.txt 
cáñamo 

El comando od nos muestra que los caracteres acentuados y las ñ se codifican en 2 bytes:

$ od -c utf8.txt 
0000000   c 303 241 303 250   a   m   o  \n 
0000011 

Número de bytes del archivo:

$ wc -c utf8.txt 
9 utf8.txt 

Número de caracteres del archivo:

$ wc -m utf8.txt 
7 utf8.txt 

Las variables de entorno que definen la codificación son LC_ALL, LC_CTYPE y LANG. Estas se transmiten a los comandos a través del shell (tienen que exportarse) y se evalúan en este orden: el primer valor leído es el que se tiene en cuenta.

Obtener la lista de valores de localización (valor ligado al país y al idioma) disponibles en el sistema:

$ locale -a | grep es_ES 
es_ES 
es_ES@euro 
es_ES.iso88591 
es_ES.iso885915@euro 
es_ES.utf8 
$ 

2. Extracción de caracteres: cut

El comando cut sirve para recuperar (cortar) caracteres o campos de una línea.

Sintaxis

Cortar por caracteres:

$ cut -c3

[ archivo ... ]

El tercer carácter.

$ cut -c3-5...

Compresión, archivado y conversión

1. Compresión: gzip, bzip2

Los comandos gzip/gunzip, bzip2/bunzip2 comprimen/descomprimen cada archivo pasado como argumento en la línea de comandos. El comando bzip2 ofrece una mejor tasa de compresión. Estos comandos se consideran estándar en los sistemas Linux y pueden instalarse en los sistemas Unix, en caso de no estarlo. El comando gzip produce la extensión .gz y el comando bzip2 produce la extensión .bz2.

Sintaxis de gzip

Compresión:

gzip [ opciones ] [ archivo ...  ]  

Descompresión:

gunzip [ opciones ] [ archivo ...  ] 
zcat [ opciones ] [ archivo ...  ] 

Principales opciones:

-c

Enviar el resultado de la compresión/descompresión por la salida estándar. El comando gunzip -c es equivalente al comando zcat.

-t

Comprobar la validez del archivo.

Si el nombre del archivo se omite, los datos que se han de procesar se leen de la entrada estándar.

Ejemplo

Compresión del archivo java.doc:

$ gzip java.doc 

El archivo original se remplaza por el archivo comprimido:

$ ls java* 
java.doc.gz 

Descompresión: el archivo original se restituye y remplaza al archivo comprimido:

$ gunzip java.doc 
$ ls java* 
java.doc 

Compresión con envío del flujo comprimido hacia la salida estándar (-c). Este modo de proceder permite conservar el archivo original:

$ gzip -c java.doc > java.doc.gz 
$ ls java* 
java.doc java.doc.gz 

Descomprimir sin suprimir el archivo comprimido:

$ gunzip -c java.doc.gz > java.doc 

Lo mismo con el comando zcat:

$ zcat java.doc.gz > java.doc 

Los comandos bzip2, bunzip2 y bzcat funcionan de un modo parecido, con una ligera diferencia en el uso de las opciones.

Sintaxis de bzip2

Compresión:

bzip2 [ opciones ] [ archivo ... ] 

Descompresión:

bunzip2 [ archivo ... ] 
bzip2 -d [ opciones ] [ archivo ... ] 
bzcat [ opciones ] [ archivo ... ] 

Principales opciones:

-c

Enviar el resultado de la compresión/descompresión por la salida estándar. El comando bzip2 -dc es equivalente al comando bzcat.

-d

Descompresión.

-t

Comprobar la validez del archivo.

2. Archivos tar

El comando tar permite crear un archivado a partir de uno o varios archivos. Si el archivo es un directorio, se archivará con toda su subestructura.

Sintaxis

Creación de un archivado:

tar -c [-zv] -f archivado  archivos_para_archivar...

Comandos de red seguros

Esta sección presenta el comando de conexión a distancia "ssh" y el comando de transferencia de archivos sftp.

1. Conexión remota: ssh

El comando ssh (secure shell) permite conectarse a una máquina remota. Los datos intercambiados entre las máquinas están cifrados.

Sintaxis

Conexión a una máquina remota:

ssh [-l nombre_login] nombre_máquina 

Ejecución de un comando a una máquina remota:

ssh nombre_login@nombre_máquina [comando] 

Con la primera conexión al servidor, este envía su clave pública. Esta clave representa el identificador único de la máquina.

El comando ssh solicita al usuario si reconoce el valor de la clave y si acepta la conexión. En caso afirmativo, la clave del servidor se almacena en el archivo $HOME/.ssh/known_hosts de la máquina cliente.

Teóricamente, el usuario de la máquina cliente tiene que verificar con el adminisitrador de la máquina remota que la clave propuesta es correcta antes de aceptar la primera conexión.

Ejemplos

Primera conexión al servidor www.misitio.com: el usuario de la máquina local es "root"; ssh usa este usuario en la máquina remota:

# ssh www.misitio.com 
The authenticity of host 'www.misitio.com (162.44.116.12)' 
can't be  established. 
RSA key fingerprint is 1f:7b:e4:99:b1:c7:56:59:a0:a8:b1:ed:56:7f:19:a3. 
Are you sure you want to continue connecting (yes/no)? yes 
Warning: Permanently added 'www.misitio.com,162.39.106.10' (RSA)
to  the list of known hosts. 
root@www.misitio.com's password: ***** 
# 

Conectarse como cristina en la máquina www.misitio.com:

# ssh -l cristina www.misitio.com 
cristina@ www.misitio.com 's password: ***** 

Ejecutar el comando ls -l en la máquina remota:

# ssh www.misitio.com ls -l 
root@ www.misitio.com 's password: ***** 

Si ssh se usa en un script, es posible comprobar su estado de retorno. Si ssh produce algún error, retorna el estado 255 (error de conexión al servidor, por ejemplo). Si devuelve otro valor, este representa el estado devuelto por el comando que se ha pasado como argumento de ssh. A modo de recordatorio, el estado del último comando se obtiene mediante de la variable $?.

2. Transferencia de archivos: sftp

El comando...

Otros comandos

1. El comando xargs

El comando xargs, colocado detrás de una tubería, recupera las cadenas pasadas por argumento de la entrada estándar y ejecuta comando2 pasándole estas cadenas como argumento.

Sintaxis

comando1 | xargs [ opciones ] comando2 

Principales opciones:

I cadena

Permite ejecutar comando2 para cada valor recibido en la entrada estándar sustituyendo "cadena" por el valor recibido.

-n numarg comando 2g

Solo recibirá numarg argumentos y se ejecutará tantas veces como sea necesario, lo que permitirá evitar exceder el número máximo de argumentos que puede admitir comando2.

-t

Muestra el o los comandos ejecutados realmente (traza de la ejecución).

La ventaja del comando xargs es que permite ubicar un comando (representado por comando2) que no lee su entrada estándar detrás de un pipe o ejecutar un comando (representado por comando2) varias veces con diferentes lotes de argumentos cuando la lista de estos es demasiado grande para ejecutar el comando en una sola vez.

Opciones -I y -n:

Si no se especifican las opciones -I ni -n, comando2 se ejecuta una sola vez y utiliza la salida estándar de comando1 como argumentos. Si se usa -I o -n, se ejecuta command2 para cada argumento/lote de argumentos recibidos.

Primer ejemplo

El archivo nombre_archivo.txt contiene una lista consecuente de nombres de archivo para eliminar.

$ cat nombre_archivos.txt      # extraer del archivo  
rep1/f1a   
rep1/f1b   
rep2/f2a   
rep2/f2b   
...   
$ 

El siguiente comando no es válido porque rm no lee su entrada estándar:

$ cat nombre_archivos.txt | rm   
rm: operando ausente 

Utilización de xargs:

xargs transmite al comando rm los nombres de archivos recibidos del pipe. Aquí, el comando rm se lanza...