Wildcards y Streams
Contenido
Wildcards y Streams¶
Caracteres y strings¶
Los caracteres
son unidades de información que se representan con símbolos. Pueden ser de varios tipos como alfanuméricos, números enteros, signos de puntuación. Varios caracteres son interpretados por la shell de manera especial. Estos se llaman caracteres especiales
, y permiten desarrollar alguna lógica, dependiendo del contexto. Por ejemplo, algunos caracteres especiales son: @
#
.
?
!
,
/
\
>
~
a
µ
g
§
R
.
Nota
Cada caracter se asocia a una combinación diferente de teclas en el teclado del computador.
Los strings
son arreglos de caracteres. Esto quiere decir que son caracteres en conjunto y con un orden en particular. Por ejemplo, el string pizza
tiene 4 diferentes caracteres: i
, p
, z
, a
. Diferentes combinaciones de caracteres pueden formar diferentes strings.
Creemos un string y luego imprimámoslo en la pantalla del Terminal. Escribe los siguientes comandos:
$ mi_primer_string="Taller de bioinformática"
$ echo $mi_primer_string
Wildcards¶
Los wildcards
o wild characters
son símbolos utilizados para representar uno o más caracteres. Se pueden utilizar con otros comandos para facilitar el procesamiento o búsqueda de archivos, directorios y datos en general. En la siguiente tabla presentamos algunos de los wildcards más usados:
Wildcard |
Función |
---|---|
|
Asocia uno o más caracteres especificados por el usuario, con caracteres en un string con el que se opera. |
|
Asocia solo un caracter a la vez en un string. |
|
Asocia cuaquier caracter dentro en un string. |
Tip
El wildcard más usado es *
porque es muy versátil.
Ejercicio: Uso básico de wildcards¶
Por ejemplo, el wildcard *
me permitiría encontrar todos los archivos en una carpeta que tengan la palabra TESIS
en ellos. Primero generemos estos archivos:
$ cd ~/taller_unix/3_manejo_terminal
$ touch MI_TESIS.tex MI_TESIS_tutor2.tex TESIS.tex TESIS_YA_ACABATE.tex TESIS_finaaaaal.tex TESIS_final.tex TESIS_tutor1.tex TESIS_tutor2.tex a_reporte_01.txt b_reporte_02.txt c_reporte_03.txt z_reporte_30.txt
Podemos listar todos los archivos que empiecen por el string TESIS
:
$ ls -l TESIS*
![./img/wc_1.png](../../_images/wc_1.png)
Listar todos los archivos que terminen por el string .tex
:
$ ls -l *.tex
![./img/wc_2.png](../../_images/wc_2.png)
Buscar todos los archivos que contengan la palabra TESIS
pero con 3 caracteres desconocidos antes:
$ ls -l ???TESIS*
![./img/wc_3.png](../../_images/wc_3.png)
Buscar los archivos que terminen con el número 1 o 2 en su nombre antes de la extensión del archivo:
$ ls -l *[1-2].tex
![./img/wc_4.png](../../_images/wc_4.png)
Encontrar los archivos que terminen en dos números del 1 al 3 y del 0 al 2 antes del formato del archivo:
$ ls -l *[0-3][0-2].txt
![./img/wc_5.png](../../_images/wc_5.png)
Encontrar todos los archivos con este formato ?_reporte_[0-3][0-3].txt
:
$ ls -l ?_reporte_[0-3][0-3].txt
![./img/wc_6.png](../../_images/wc_6.png)
Todos los archivos que contengan a
o z
:
$ ls -l *[az]*
![./img/wc_7.png](../../_images/wc_7.png)
Ahota, borramos todos estos archivos:
$ rm *.tex *.txt
Operadores de redirección de datos I/O¶
Usualmente, cuando trabajamos con datos, es necesario pasar el resultado de un comando a otro para hacer un procesamiento de datos apilado, como en un algoritmo. Un stream
o corriente
esta hecha de datos. Es una corriente de datos. Un ejemplo muy familiar es el teclado y la pantalla. El teclado tiene una interfaz en donde por cada tecla presionada, un caracter se guarda en un archivo. Se dice entonces que es una corriente de entrada
. Cuando la pantalla nos muestra lo que estamos escribiendo entonces la data sale hacia nosotros y eso convierte a la pantalla en una corriente de salida
. Los dispositivos que hacen este tipo de transmisión de datos se llaman dispositivos I/O
(input y output). Los operadores que se encargan de esto se conocen como operadores de redirección
. Tres importantes son:
Comando |
Función |
---|---|
|
Stream de salida de datos. Sobre escribre sobre un archivo. |
|
Stream de salida de datos. Adjunta nueva salida a datos preexistentes en un archivo. |
|
Stream de entrada de datos. Recibe datos para procesamiento con algun comando. |
Ejercicio: Output streams, input streams¶
Creemos un archivo que contenga muchos géneros de bacterias raras mediante los comandos echo
y un operador de salida >
, y luego visualizamos con el comando cat
.
$ cd ~/taller_unix/3_manejo_terminal
$ echo -e "\nRickettsia\nOrientia\nWolbachia\nAegyptianella\nAnaplasma\nCowdria\nEhrlichia\nNeorickettsia\nCaedibacter\nHolospora\nLyticum\nOdyssella\nSymbiotes\nTectibacter" > bacterias_generos.txt
$ cat bacterias_generos.txt
![./img/wc_8.png](../../_images/wc_8.png)
Ahora vamos a agregar un género al final usando el operador >>
.
$ echo -e "\nEscherichia\n:D" >> bacterias_generos.txt
$ cat bacterias_generos.txt
![./img/wc_9.png](../../_images/wc_9.png)
Ahora, usaremos el comando sort para reordenar todos los géneros. Sin embargo notamos que el archivo original no cambia nunca.
$ sort < bacterias_generos.txt
![./img/wc_10.png](../../_images/wc_10.png)
Para hacer un cambio sobre bacterias_generos.txt
, usamos este comando. Notamos que ahora no usamos >>
sino solo >
. Esto va a borrar el contenido previo con géneros desordenados y ahora los va a ordenar. El cambio no se puede deshacer, así que ten cuidado con el operador >
para que no pierdas datos.
$ (sort < bacterias_generos.txt) > bacterias_generos_sorted.txt
$ cat bacterias_generos_sorted.txt
![./img/wc_11.png](../../_images/wc_11.png)
Advertencia
El operador >
sobrescribe archivos. Ten cuidado al usarlo para que no pierdas datos.