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...