BASH - Tutorial 3 Expresiones Regulares RESUMEN CLASE
BASH - Tutorial 3 Expresiones Regulares RESUMEN CLASE
BASH - Tutorial 3 Expresiones Regulares RESUMEN CLASE
2. Metacaracteres.
La construcción de expresiones regulares depende de la asignación de significado especial a algunos
caracteres. En el patrón aba*.txt el carácter * no vale por sí mismo, como el carácter asterisco, sino que
indica un "conjunto de caracteres cualesquiera". Asimismo, el carácter ? no se interpreta como el signo de
interrogación sino que representa "un carácter cualquiera y uno solo". Estos caracteres a los que se asigna
significado especial se denominan "metacaracteres".
El conjunto de metacaracteres para expresiones regulares es el siguiente:
\^$.[]{}|()*+?
Estos caracteres, en una expresión regular, son interpretados en su significado especial y no como los
caracteres que normalmente representan. Una búsqueda que implique alguno de estos caracteres obligará a
u lizar el barra de escape \, como se hace para evitar la interpretación por el shell de los metacaracteres del
shell. En una expresión regular, el carácter ? representa "un carácter cualquiera"; si escribimos \?, estamos
representando el carácter ? tal cual, sin significado adicional.
Los corchetes [ ] delimitan listas de caracteres individuales. Muchos metacaracteres pierden su significado si están dentro
de listas: los caracteres especiales. * [ \ valen por sí dentro de [ ]. Para incluir un carácter ] en una lista, colocarlo al principio;
para incluir un ^ colocarlo en cualquier lugar menos al principio; para incluir un - colocarlo al final.
^ Representa el comienzo de la cadena (cadena nula al principio de línea). Por ejemplo ^[a-z] representa todas los párrafos
que comiencen en minúscula. Si va dentro de los corchetes, sirve para negar.
Operador Significado
r+ 1 o más ocurrencias de la ER r
r? 0 o una ocurrencia de la ER r, y no más
r{n} n ocurrencias de la ER r
r{n,} n o más ocurrencias de la ER r
r{,m} 0 o a lo sumo m ocurrencias de la ER r
r{n,m} n o más ocurrencias de la ER r, pero a lo sumo m
r1|r2 la ER r1 o la ER r2 (alterna va)
(r) ER anidada
"r" evita que los caracteres de la ER r sean interpretados por el shell
La repe ción ene precedencia sobre la concatenación; la concatenación ene precedencia sobre la
alterna va. Una expresión puede encerrarse entre paréntesis para ser evaluada primero.
ER Extendidas Representa
[0-9]+ 0 1 9 00 99 123 456 999 9999 99999 99999999 ..
[0-9]? cadena_vacía 0 1 2 .. 9
^a|b a b
(ab)* cadena_vacía ab abab ababab ...
^[0-9]?b b 0b 1b 2b .. 9b
([0-9]+ab)* cadena_vacía 1234ab 9ab9ab9ab 9876543210ab 99ab99ab ...
\* Representa el carácter *
. Representa cualquier carácter excepto el <eol> [a-f] Representa un carácter cualquiera
entre la a y la f
[A-Z] Cualquier letra mayúscula
[^a-d] Cualquier carácter que no sea una letra entra la a y la d
[a-z]* cualquier palabra escrita con minúsculas
[a-z][A-Z] cualquier palabra de dos letras, de las cuales la primera el minúscula y la segunda es mayúscula
^\(.*\)\1\1 Al comienzo de la línea, un campo formado por un carácter cualquiera que se repite las veces que
sea, volviendo a aparecer dos veces más antes de que acabe la línea.
^[a-z]* selecciona las líneas que sólo contengan letras minúsculas
^[a-z]\{3\}[^a-z]\{3\} selecciona las líneas que comienzan con tres minúsculas, terminan con tres caracteres
cualesquiera pero que no son minúsculas, y no ene ningún otro carácter entre medio
3. Filtros
Se da el nombre de filtros a un grupo de comandos que leen alguna entrada, realizan una transformación y
escriben una salida. Además de los que veremos aquí, incluye comandos tales como head, tail, wc y cut. Son
comandos que frecuentemente se u lizan con las tuberías.
Si no se indican campos de ordenación, la comparación se hace sobre toda la línea. Si se indican campos, la
comparación se hace considerando la cadena de caracteres iniciada en el primer carácter del primer campo
hasta el úl mo carácter del úl mo campo.
sort -t: -k1,3 f1.txt Ordena por campos separados por ":", tomando en cuenta para la comparación los
caracteres desde el primero del campo 1 hasta el úl mo del campo 3.
sort -t: -k1.3,3.5 f1.txt ordena por campos tomando en cuenta desde el 3er. carácter del campo 1 hasta el 5to.
Carácter del campo 3.
sort -nr f2.num ordena en orden numérico descendente.
sort -k3 f3.txt ordena alfabé camente, usando como cadena de comparación la comprendida desde el primer
carácter del 3er. campo hasta el fin de línea. Como no se indica separador, los campos se definen por blancos
(espacio o tabulador).
Una vez ubicados los archivos, find puede realizar diversas acciones sobre ellos:
∙ ver o editar;
∙ guardar sus nombres en otro archivo;
∙ eliminarlos o renombrarlos;
∙ cambiar sus permisos de acceso;
∙ clasificarlos por grupos.
find /var -name *.log –print busca en el directorio /var los archivos terminados en .log, imprime sus nombres
en la salida.
find /tmp -size +200k –print busca archivos mayores de 200k. En los argumentos numéricos, +N es mayor que
N, -N es menor que N, N es exactamente igual a N.
find /var/spool/mail -a me +30 –print busca archivos no accedidos hace más de 30 días. La opción - a me se
refiere a empo transcurrido desde úl ma lectura, - m me
desde úl ma modificación de estado o permisos, -
c me de contenido.
find /var/tmp -empty -exec rm {} \; busca archivos vacíos y los borra.
find /home -nouser –ls busca archivos en los cuales en lugar del nombre de usuario dueño aparece un
número (UID). Esta situación se da cuando la cuenta de usuario
ha sido borrada pero han permanecido los archivos creados por
ese usuario.
grep '^[^:]*::' /etc/passwd busca usuarios sin contraseña; caracteres al principio de línea que no sean ":", y
luego "::" (el segundo lugar, que es el de la contraseña, está
vacío).
grep '^[^:]*:\*:' /etc/passwd busca usuarios que no pueden entrar al sistema; enen un * en el lugar de la
contraseña; \ escapa el significado del segundo *, que vale como
carácter a buscar.
grep ‘^d’ text busca las líneas que empiecen por d en el fichero text. grep ‘^[^d]’ text busca las líneas que
grep –v ‘^C’ fich1 > fich2 quita las líneas de fich1 que comienzan por C y lo copia en fich2
La ejecución de egrep siguiente, busca cadenas comenzadas opcionalmente por un dígito y los caracteres ab,
todo el paréntesis 0 o más veces, y hasta encontrar la cadena 1234.
egrep "([0-9]+ab)*1234" archivo
Escribir grep -E es similar a egrep, aunque no idén co; egrep es compa ble con el comando histórico egrep;
grep -E acepta expresiones regulares extendidas y es la versión moderna del comando en GNU. fgrep es
idén co a grep -F.
3.5. Comando tr
El comando tr dado un flujo de datos (entrada estándar) nos permite modificarlos sus tuyendo y/o borrando
caracteres. La sus tución es carácter a carácter.
La sintaxis de este comando:
tr [opción] .. SET1 [SET2]
donde opción puede ser:
-d Borra los caracteres indicados en SET1
-s Elimina o reemplaza los caracteres repe dos indicados en SET1 -
-c Todos los caracteres que no sean los indicados en SET1 y los convierte en SET2 -
Sus tución
En su forma más simple, podemos sus tuir un carácter por otro, por ejemplo, podemos transformar todas las
vocales en mayúsculas.
$ echo murcielago | tr aeiou AEIOU
Daría como resultado mUrcIElAgO
En esta ocasión hemos ejecutado el comando tr sin ningún argumento, 'aeiou' seria SET1 y 'AEIOU'
correspondería a SET2.
La sus tución se realiza a pares, el primer carácter de SET1 será reemplazado por el primer carácter de SET2,
el segundo con el segundo y así hasta el final.
Si no ene la mism longituda SET1 y SET2, la salida cambia.
$ echo murcielago | tr aeiou AE
mErcEElAgE
Borrar
El borrado de caracteres es más fácil de usar. En este caso solo necesitamos SET1, para indicar que caracteres
queremos borrar.
En el siguiente ejemplo borraremos las letras 'a' y 'e' de la palabra 'murcielago'. $
echo murcielago | tr -d ae
Daría como resultado murcilgo
Sus tuir con negados
Si u lizamos la opción -c, el comando localizará todos los caracteres que no coincidan con el patrón dado en
SET1 y los reemplazara por sus correspondientes en SET2.
$ echo 'naci el 13-12-1986' | tr -c '0123456789' '-'
--------13-12-1986-
El comando tr ha subs tuido por un guion cualquier carácter que no fuera un número. Pues eso ha hecho, el
salto de línea aunque invisible también es tenido en cuenta como un carácter.
Secuencias válidas
El comando reconoce los siguientes caracteres no visibles.
\NNN carácter con valor octal NNN (de uno a tres dígitos)
\\ barra inver da
\a pi do audible (BELL)
\b espacio hacia atrás
\f salto de página
\n salto de línea
\r retorno de carro
\t tabulación horizontal
\v tabulación ver cal
El comando ls sin argumentos, nos devuelve una lista tabulada por columnas con el nombre de los archivos
de un directorio determinado, con tr podemos modificar la salida del comando ls para obtener una lista con
un elemento por línea.
$ ls |tr '\t' '\n'
gedit.banyut.1053685335
kde-banyutyHf1n2
keyring-GLhk1g
ksocket-banyut
orbit-banyut
orbit-root
plugtmp
pulse-banyut
screenlets
seahorse-7f0yeD
Tracker-banyut.8264
virtual-banyut.F7zFmY
Hemos subs tuido los tabuladores por saltos de línea, también podríamos cambiar las barras de un path. $
echo '\banyut\tmp\' |tr '\\' '/'
/banyut/tmp/
Ejemplos de uso de tr
cat dias | tr a-z A-Z convierte todo a mayúsculas.
cat dias | tr -d aeiou borra todas las vocales del archivo dias.
Agregar al archivo dias líneas en blanco, varias seguidas, intercaladas entre los nombres de los días. cat
dias
cat dias | tr -s "\n*" convierte varios caracteres nueva línea seguidos en una solo; elimina renglones en
blanco.
cat nota | tr -c "[a-zA-Z0-9]" "_" transforma todos los caracteres que no sean letras o números en subrayas.
cat nota | tr -cs "[a-zA-Z0-9]" "[\n*]" transforma todos los caracteres que no sean letras o números en nueva
línea, y comprime las nueva líneas repe das en una sola; deja cada palabra sola en un renglón.
ls -l /usr | tr -s " " | cut -d " " -f 3,4 comprime los blancos en la salida para poder cortar campos.
3.6. Comando uniq
El comando uniq excluye todos los renglones adyacentes duplicados menos uno; es decir, elimina renglones
repe dos consecu vos. La sintaxis es la siguiente:
uniq [OPCION]... [ENTRADA [SALIDA]]
Este comando muestra una única línea para una entrada ordenada, eliminando líneas repe das sucesivas.
Opcionalmente, puede mostrar solo líneas que aparecen una vez, o sólo líneas que aparecen varias veces. La
entrada debe estar ya ordenada; si no lo está, se puede usar sort -u para lograr un efecto similar.
Las opciones de uniq son:
-f N salta N campos antes de verificar unicidad.
-s N salta N caracteres antes de verificar unicidad.
-c indicar junto a cada línea el número de veces que aparece. -i ignorar
mayúsculas y minúsculas al comparar.
-d mostrar sólo líneas repe das. -u mostrar sólo líneas únicas.
El siguiente ejemplo muestra las 5 palabras más frecuentes en el conjunto de archivos: cat
*.txt | tr -sc A-Za-z '\012' | sort | uniq -c | sort -n | tail 5
cat lista todos los archivos, tr comprime el renglón eliminando blancos, sort los ordena, uniq cuenta las
ocurrencias y elimina repe dos, sort -n ordena por can dad de ocurrencias y tail muestra las 5 ocurrencias
más frecuentes.
3.8. Comando wc
El nombre del comando wc proviene de word count, y como es de suponer, sirve para contar palabras. Pero
no sólo palabras como se verá a con nuación. Su sintaxis es como sigue:
wc [opción] [archivo …]
Si se omite el argumento archivo, wc tomará los datos (naturalmente) de la entrada estándar. La
lista de opciones más importantes es la siguiente:
-c Contar bytes.
-l Contar líneas.
-w Contar palabras.
Como ejemplo, se pueden contar las líneas del archivo /etc/passwd y de esta manera se sabrán rápidamente
cuántos usuarios ene definidos el sistema:
usuario@maquina:~/$ wc -l /etc/passwd
32 /etc/passwd
4. Comando id
El comando id muestra el ID real y efec vo del usuario y del grupo. La sintaxis del comando es la siguiente: id
[OPCION]... [USUARIO]
La salida del comando imprime información sobre el usuario y el grupo para el USUARIO especificado, si se
omite el nombre del usuario, se muestra el resultado para el usuario actual.
Las opciones más importantes son las siguientes:
5. Comando stat
El comando stat muestra información sobre el estado de un fichero o del sistema de ficheros. Su
sintaxis es la siguiente:
stat [OPCION]... FICHERO...
%F Tipo de archivo
%g ID del grupo de propietario
%y Tiempo de la úl ma modificación
6. Variable IFS
Esta variable define el carácter separador que se u liza para separar campos dentro de un fichero. Por
ejemplo IFS es “:” dentro del fichero /etc/passwd, ya que este carácter es el que se u liza para separar los
diferentes campos de cada fila. Esta variable puede modificar igual que cualquier otra.
Podemos acceder a su contenido con echo $IFS, y podemos cambiar el valor separador por defecto de la
siguiente forma:
antIFS=$IFS
IFS=”-“
De forma que en la variable antIFS mantenemos el separador predeterminado, y puntualmente definimos “-“
como nuevo separador.
7. Declaración de variables.
Cuando declara una variable dentro de un shell-script, por ejemplo si introducido la siguiente línea de código
X=343
se está creando una variable de nombre X que almacena el valor 343. Si queremos mostrar su contenido
podemos ejecutar
echo $X
mostrándose 343
Esta variable es una variable global al shell, pero local a él. Es decir, la variable X puede ser accedida a través
de todo el shell, pudiendo comprobar y modificar su contenido. Esta variable es, sin embargo global al shell
donde se u liza. Si queremos que sea accesible por otros Shell que queramos u lizar, podemos conver rla en
global u lizando el comando export
export X=343
de esta forma, la variable X puede ser accedida y modificado desde el entorno BASH. Si nos interesa definir
variables locales a una función, se u liza el comando local de la siguiente forma
function mi_funcion ()
{
local variable_local=34
echo $variable_local
}
La variable variable_local ene como ámbito solo la función mi_funcion, no pudiendo ser accesible desde
fuera de la función donde se declara y u liza.