Expresar mejor que lineas utilizar en los comandos para leer texto (grep y sed) es el principal uso de los expresiones regulares. Al dominarlas, podremos extender nuestro manejo de patrones o frases a buscar.
Si por ejemplo se buscan palabras que contengan la letra D en un archivo de texto.
[tusysadmin@localhost dict]$ grep d spanish | head -n 5
abad
abada
abadejo
abadenga
abadengo
Diferente sería mostrar las palabras que inician con esa letra, para esto usamos el acento circunflejo (^).
[tusysadmin@localhost dict]$ grep ^d spanish | tail -n 5
duunviral
duunvirato
duunviro
dux
duz
Si por el contrario, buscamos las palabras que terminen con la letra D usamos el símbolo de dólar ($).
[tusysadmin@localhost dict]$ grep d$ spanish | head -n 5
abad
absurdidad
accesibilidad
accidentalidad
aceptabilidad
Es posible usar los corchetes [ ] para indicar los caracteres que pueden aparecer dentro de una determinada posición.
La salida del comando anterior muestra las palabras que inician con d seguido de una de las letras a, e o i; seguido de la letra s y por último una de las letras a o e.
Exclusiones y Rangos
Si lo que se busca es decir que caracteres no queremos imprimir usamos el ^ dentro de los corchetes.
Dentro de los corchetes es posible aceptar rangos para indicar todos los valores intermedios entre valor inicial y final. Esto sustituye el tener que escribir varias letras o números.
[tusysadmin@localhost dict]$ grep ^c[l-t]s[m-z].$ spanish
cospe
costa
coste
costo
Podemos negar el contenido de los corchetes usando en circunflejo.
De igual forma que en ejemplos anteriores, el numero puede ser fijo o manejar mínimos y máximos. Hasta aquí el post del día de hoy, cualquier duda la pueden dejar en los comentarios.
Cuando tenemos archivos de texto y queremos dar formato simplemente abrimos el archivo en cuestión con nuestro editor de texto preferido (nano o vim) y modificamos dicho archivo. Lamentablemente, no siempre es posible hacer todo con editores de texto, para esos casos existen comandos que permiten la modificación de texto de una forma practica y sencilla.
Antes de empezar a tirar comandos es necesario saber que existen clases de caracteres.
[:alnum:] : Letras y Dígitos
[:alpha:] : Letras
[:blank:] : Espacios en Blanco
[:cntrl:] : Caracteres de control
[:digit:] : Dígitos
[:graph:] : Caracteres impresos sin incluir espacios
[:lower:] : Letras minúsculas
[:print:] : Caracteres impresos incluidos espacios
[:punct:] : Signos de puntuación
[:space:] : Espacios en blanco verticales y horizontales
[:upper:] : Letras mayúsculas
[:xdigit:] : Dígitos Hexadecimales
Tomando como ejemplo el siguiente archivo de texto.
[tusysadmin@localhost ~]$ cat saludo.txt
Bienvenidos a Avenida Siempre Viva 742
Sustituir todos los dígitos por X.
[tusysadmin@localhost ~]$ tr [:digit:] X < saludo.txt
Bienvenidos a Avenida Siempre Viva XXX
[tusysadmin@localhost ~]$ tr [:lower:] [:upper:] < saludo.txt
BIENVENIDOS A AVENIDA SIEMPRE VIVA 742
Si quisiéramos sustituir o eliminar determinadas palabras y/o lineas de un archivo como el siguiente, nos podemos apoyar con el comando sed.
[tusysadmin@localhost ~]$ cat -n navegadores.txt
1 Los navegadores Web facilitaron el uso de Internet,
2 Sin ellos seguiríamos usando lineas de comandos
3 para conectarnos a los servicios que necesitamos.
4
5 Los más conocidos son Edge, Mozilla Firefox,
6 Opera, Safari y Google Chrome. Sin embargo,
7 son el resultado de la varias adaptaciones, cambios
8 y evoluciones.
9
10 El primer navegador fue WorlWideWeb pero solo
11 funcionaba con Next. El segundo fue Mosaic del
12 cual Mozilla tomó código para su desarrollo, pero
13 uno de los más importantes y que fue el boom de
14 los navegadores fue NetScape.
15
16 NetScape tuvo tanto éxito que motivó la creación
17 de Internet Explorer por parte de Microsoft. Al final,
18 NetScape perdió la llamada guerra de los navegadores
19 contra Internet Explorer.
20
21 Hoy en día Internet Explorer se encuentra al borde de
22 ser descontinuado para dar paso a Edge. Veremos en
23 el futuro que navegador logra sobrevivir.
Mostrar el último párrafo (lineas 21-23) indicando la omisión de las lineas 1-20.
[tusysadmin@localhost ~]$ cat -n navegadores.txt | sed -e '1,20d'
21 Hoy en día Internet Explorer se encuentra al borde de
22 ser descontinuado para dar paso a Edge. Veremos en
23 el futuro que navegador logra sobrevivir.
Imprimir ciertas lineas usando la opción -p.
[tusysadmin@localhost ~]$ cat -n navegadores.txt | sed -n -e '1,3p'
1 Los navegadores Web facilitaron el uso de Internet,
2 Sin ellos seguiríamos usando lineas de comandos
3 para conectarnos a los servicios que necesitamos.
Omitir los las lineas en blanco.
[tusysadmin@localhost ~]$ sed '/^$/d' navegadores.txt
Sustituir las líneas en blanco.
[tusysadmin@localhost ~]$ sed -e '/^$/c\#Linea en blanco' navegadores.txt
Los navegadores Web facilitaron el uso de Internet,
Sin ellos seguiríamos usando lineas de comandos
para conectarnos a los servicios que necesitamos.
#Linea en blanco
Los más conocidos son Edge, Mozilla Firefox,
Opera, Safari y Google Chrome. Sin embargo,
son el resultado de la varias adaptaciones, cambios
y evoluciones.
#Linea en blanco
El primer navegador fue WorlWideWeb pero solo
funcionaba con Next. El segundo fue Mosaic del
cual Mozilla tomó código para su desarrollo, pero
uno de los más importantes y que fue el boom de
los navegadores fue NetScape.
#Linea en blanco
NetScape tuvo tanto éxito que motivó la creación
de Internet Explorer por parte de Microsoft. Al final,
NetScape perdió la llamada guerra de los navegadores
contra Internet Explorer.
#Linea en blanco
Hoy en día Internet Explorer se encuentra al borde de
ser descontinuado para dar paso a Edge. Veremos en
el futuro que navegador logra sobrevivir.
Este comando sustituye las lineas en donde encuentra la coincidencia, el problema es que sustituye toda la linea, si en lugar de buscar lineas en blanco hubiera buscado las palabras Internet Explorer, entonces pasaría algo como lo siguiente.
~]$ sed -e '/Internet Explorer/c\Explorer was Here' navegadores.txt
Los navegadores Web facilitaron el uso de Internet,
Sin ellos seguiríamos usando lineas de comandos
para conectarnos a los servicios que necesitamos.
Los más conocidos son Edge, Mozilla Firefox,
Opera, Safari y Google Chrome. Sin embargo,
son el resultado de la varias adaptaciones, cambios
y evoluciones.
El primer navegador fue WorlWideWeb pero solo
funcionaba con Next. El segundo fue Mosaic del
cual Mozilla tomó código para su desarrollo, pero
uno de los más importantes y que fue el boom de
los navegadores fue NetScape.
NetScape tuvo tanto éxito que motivó la creación
Explorer was Here
NetScape perdió la llamada guerra de los navegadores
Explorer was Here
Explorer was Here
ser descontinuado para dar paso a Edge. Veremos en
el futuro que navegador logra sobrevivir.
Sustituir exclusivamente una palabra o palabras sin quitar toda la linea.
~]$ sed -e 's/Internet Explorer/Explorer Lento/g' navegadores.txt
Los navegadores Web facilitaron el uso de Internet,
Sin ellos seguiríamos usando lineas de comandos
para conectarnos a los servicios que necesitamos.
Los más conocidos son Edge, Mozilla Firefox,
Opera, Safari y Google Chrome. Sin embargo,
son el resultado de la varias adaptaciones, cambios
y evoluciones.
El primer navegador fue WorlWideWeb pero solo
funcionaba con Next. El segundo fue Mosaic del
cual Mozilla tomó código para su desarrollo, pero
uno de los más importantes y que fue el boom de
los navegadores fue NetScape.
NetScape tuvo tanto éxito que motivó la creación
de Explorer Lento por parte de Microsoft. Al final,
NetScape perdió la llamada guerra de los navegadores
contra Explorer Lento.
Hoy en día Explorer Lento se encuentra al borde de
ser descontinuado para dar paso a Edge. Veremos en
el futuro que navegador logra sobrevivir.
El uso de sed se extiende a las hojas de calculo, ya que es posible manejarlas como cualquier archivo de texto. Para este ejemplo generé un archivo en http://generatedata.com/ al que nombré random.csv.
Con este simple comando borramos todas las lineas que tengan un correo con el dominio @aol y al mismo tiempo reemplazamos el dominio hotmail por msn. Para guardar los cambios en el archivo usamos la opción -i.
La salida de los comandos que ponemos en nuestra terminal pueden ser redirigidos a un archivo o ser reutilizados por otro comando. Por ejemplo, imprimiremos en pantalla el famoso Hola mundo
[tusysadmin@localhost ~]$ echo "Hola mundo"
Hola mundo
Por otro lado, si quisiéramos mandar este mensaje a un archivo lo haríamos así:
El signo > mandará la salida del comando a un archivo y sobrescribirá el contenido que tenga dicho archivo. Si lo que se quiere es conservar el contenido previo entonces usamos el doble >>.
[tusysadmin@localhost ~]$ echo "Hola mundo" >> hola
[tusysadmin@localhost ~]$ echo "Hola mundo" >> hola
[tusysadmin@localhost ~]$ echo "Hola mundo" >> hola
[tusysadmin@localhost ~]$ cat hola
Hola mundo
Hola mundo
Hola mundo
Hola mundo
[tusysadmin@localhost ~]$
Las redirecciones pueden ser usadas para guardar mensajes de error usando >2 o >>2
[tusysadmin@localhost ~]$ yum install nginx 2> error.log
[tusysadmin@localhost ~]$ cat error.log
Error: Este comando debe ejecutarse con privilegios de superusuario
Para conservar todos los mensajes de salida sin que estos se impriman en la pantalla usamos &> o &>> para evitar la sobrescritura.
Las redirecciones nos ayudan a generar archivos de logs para detectar problemas en instalaciones o ejecuciones de algún script de bash. De igual forma, pudiéramos no querer conservar ni imprimir la salida de un comando, si fuera el caso simplemente desechamos esta información mandándola a /dev/null.
De esta manera tenemos una impresión en pantalla limpia y sin conservar errores.
Tuberías
Las tuberíasnos permite utilizar la salida de texto de un comando como entrada de otro. De esta forma podemos simplificar la salida deseada. Ejemplo, el siguiente comando muestra todos los usuarios que inician con la letra t.
[tusysadmin@localhost ~]$ grep ^t /etc/passwd
tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
tusysadmin:x:1001:1001::/home/tusysadmin:/bin/bash
Como puede observarse, imprime información que no necesitamos si quisiéramos crear una lista. Para tomar este comando lo conectamos con«|»
De este modo corté todo lo que aparece antes del signo : quedando en una sola columna. Si necesitamos saber el uso en disco de los directorios de nuestro sistema ordenado de mayor a menor.
Es posible manejar hojas de calculo con la terminal; para esto, el archivo debe ser guardado en el formato CSV (Valores Separados por Comas). Tomando como ejemplo el siguiente archivo.
Seguramente habrás notado la falta de acentos en el nombre de los autores y libros así como la mezcla de mayúsculas y minúsculas. Lo primero es por qué en bash no se aceptan acentos ni el uso de la letra Ñ y lo segundo es parte de lo que intentaremos arreglar desde nuestra terminal.
Un archivo CSV se ve así desde en nuestra terminal, intencionalmente he omitido la primer linea.
tusysadmin@localhost ~]$ cat autores.csv
Juan Rulfo,El llano en llamas,1953
JUAN RULFO,PEDRO PARAMO,1955
GABRIEL GARCIA Marquez,La mala hora,1962
MARIO BENEDETTI,La tregua,1960
MARIO Benedetti,LA BORRA DEL CAFE,1992
Octavio Paz,Piedra del sol,1957
GABRIEL GARCIA Marquez,La hojarasca,1955
GABRIEL Garcia MARQUEZ,El coronel no tiene quien le escriba,1961
OCTAVIO PAZ,SALAMANDRA,1962
GABRIEL GARCIA MARQUEZ,El amor en los tiempos del colera,1985
GABRIEL GARCIA MARQUEZ,Del amor y otros demonios,1994
OCTAVIO PAZ,LUNA SILVESTRE,1933
Cambiar minúsculas por mayúsculas.
tusysadmin@localhost:~$ cat autores.csv | tr \[:lower:] \[:upper:]
JUAN RULFO,EL LLANO EN LLAMAS,1953
JUAN RULFO,PEDRO PARAMO,1955
GABRIEL GARCIA MARQUEZ,LA MALA HORA,1962
MARIO BENEDETTI,LA TREGUA,1960
MARIO BENEDETTI,LA BORRA DEL CAFE,1992
OCTAVIO PAZ,PIEDRA DEL SOL,1957
GABRIEL GARCIA MARQUEZ,LA HOJARASCA,1955
GABRIEL GARCIA MARQUEZ,EL CORONEL NO TIENE QUIEN LE ESCRIBA,1961
OCTAVIO PAZ,SALAMANDRA,1962
GABRIEL GARCIA MARQUEZ,EL AMOR EN LOS TIEMPOS DEL COLERA,1985
GABRIEL GARCIA MARQUEZ,DEL AMOR Y OTROS DEMONIOS,1994
OCTAVIO PAZ,LUNA SILVESTRE,1933
El comando tr significa literalmente traduce. Cambia, elimina o traduce una entrada en una salida.
tr [OPTION]... SET1 [SET2]
En el caso de nuestro ejemplo, cambiara todas las letras minúsculas [:lower:] por mayúsculas [:upper:]. Usamos el carácter > para escribir la salida del comando en un nuevo archivo.
@localhost:~$ cat autores.csv | tr \[:lower:] \[:upper:] > escritores.csv
tusysadmin@localhost:~$ cat escritores.csv
JUAN RULFO,EL LLANO EN LLAMAS,1953
JUAN RULFO,PEDRO PARAMO,1955
GABRIEL GARCIA MARQUEZ ,LA MALA HORA,1962
MARIO BENEDETTI,LA TREGUA,1960
MARIO BENEDETTI ,LA BORRA DEL CAFE,1992
OCTAVIO PAZ,PIEDRA DEL SOL,1957
GABRIEL GARCIA MARQUEZ ,LA HOJARASCA,1955
GABRIEL GARCIA MARQUEZ,EL CORONEL NO TIENE QUIEN LE ESCRIBA,1961
OCTAVIO PAZ,SALAMANDRA,1962
GABRIEL GARCIA MARQUEZ,EL AMOR EN LOS TIEMPOS DEL COLERA,1985
GABRIEL GARCIA MARQUEZ,DEL AMOR Y OTROS DEMONIOS,1994
OCTAVIO PAZ,LUNA SILVESTRE,1933
Ordenar csv
Orden alfabéticamente
tusysadmin@localhost:~$ sort escritores.csv
GABRIEL GARCIA MARQUEZ,DEL AMOR Y OTROS DEMONIOS,1994
GABRIEL GARCIA MARQUEZ,EL AMOR EN LOS TIEMPOS DEL COLERA,1985
GABRIEL GARCIA MARQUEZ,EL CORONEL NO TIENE QUIEN LE ESCRIBA,1961
GABRIEL GARCIA MARQUEZ,LA HOJARASCA,1955
GABRIEL GARCIA MARQUEZ,LA MALA HORA,1962
JUAN RULFO,EL LLANO EN LLAMAS,1953
JUAN RULFO,PEDRO PARAMO,1955
MARIO BENEDETTI,LA BORRA DEL CAFE,1992
MARIO BENEDETTI,LA TREGUA,1960
OCTAVIO PAZ,LUNA SILVESTRE,1933
OCTAVIO PAZ,PIEDRA DEL SOL,1957
OCTAVIO PAZ,SALAMANDRA,1962
En este caso se toma como referencia la primer y segunda columna, no se continua con la tercera por tratarse de números y no se le ha indicado a sort que ordene valores numéricos. Para tomar como referencia el segunda columna.
tusysadmin@localhost:~$ sort -k 2,2 -t \, escritores.csv
GABRIEL GARCIA MARQUEZ,DEL AMOR Y OTROS DEMONIOS,1994
GABRIEL GARCIA MARQUEZ,EL AMOR EN LOS TIEMPOS DEL COLERA,1985
GABRIEL GARCIA MARQUEZ,EL CORONEL NO TIENE QUIEN LE ESCRIBA,1961
JUAN RULFO,EL LLANO EN LLAMAS,1953
MARIO BENEDETTI,LA BORRA DEL CAFE,1992
GABRIEL GARCIA MARQUEZ,LA HOJARASCA,1955
GABRIEL GARCIA MARQUEZ,LA MALA HORA,1962
MARIO BENEDETTI,LA TREGUA,1960
OCTAVIO PAZ,LUNA SILVESTRE,1933
JUAN RULFO,PEDRO PARAMO,1955
OCTAVIO PAZ,PIEDRA DEL SOL,1957
OCTAVIO PAZ,SALAMANDRA,1962
Orden numérico
tusysadmin@localhost:~$ sort -n -k 3 -t \, escritores.csv
OCTAVIO PAZ,LUNA SILVESTRE,1933
JUAN RULFO,EL LLANO EN LLAMAS,1953
GABRIEL GARCIA MARQUEZ,LA HOJARASCA,1955
JUAN RULFO,PEDRO PARAMO,1955
OCTAVIO PAZ,PIEDRA DEL SOL,1957
MARIO BENEDETTI,LA TREGUA,1960
GABRIEL GARCIA MARQUEZ,EL CORONEL NO TIENE QUIEN LE ESCRIBA,1961
GABRIEL GARCIA MARQUEZ,LA MALA HORA,1962
OCTAVIO PAZ,SALAMANDRA,1962
GABRIEL GARCIA MARQUEZ,EL AMOR EN LOS TIEMPOS DEL COLERA,1985
MARIO BENEDETTI,LA BORRA DEL CAFE,1992
GABRIEL GARCIA MARQUEZ,DEL AMOR Y OTROS DEMONIOS,1994
La opción -n es usada para ordenar con valores numéricos, -k indica el numero de la columna usada como referencia; en este caso la tercer columna y finalmente -t para el campo delimitador.
Ahora ordenaremos por autor y estos a su vez por fecha de publicación.
tusysadmin@localhost:~$ sort -k1,1 -k3n,3 -t \, escritores.csv
GABRIEL GARCIA MARQUEZ,LA HOJARASCA,1955
GABRIEL GARCIA MARQUEZ,EL CORONEL NO TIENE QUIEN LE ESCRIBA,1961
GABRIEL GARCIA MARQUEZ,LA MALA HORA,1962
GABRIEL GARCIA MARQUEZ,EL AMOR EN LOS TIEMPOS DEL COLERA,1985
GABRIEL GARCIA MARQUEZ,DEL AMOR Y OTROS DEMONIOS,1994
JUAN RULFO,EL LLANO EN LLAMAS,1953
JUAN RULFO,PEDRO PARAMO,1955
MARIO BENEDETTI,LA TREGUA,1960
MARIO BENEDETTI,LA BORRA DEL CAFE,1992
OCTAVIO PAZ,LUNA SILVESTRE,1933
OCTAVIO PAZ,PIEDRA DEL SOL,1957
OCTAVIO PAZ,SALAMANDRA,1962
En caso de que quisiéramos la más reciente publicación usamos la opción -r.
tusysadmin@localhost:~$ sort -k1,1 -k3r,3 -t \, escritores.csv
GABRIEL GARCIA MARQUEZ,DEL AMOR Y OTROS DEMONIOS,1994
GABRIEL GARCIA MARQUEZ,EL AMOR EN LOS TIEMPOS DEL COLERA,1985
GABRIEL GARCIA MARQUEZ,LA MALA HORA,1962
GABRIEL GARCIA MARQUEZ,EL CORONEL NO TIENE QUIEN LE ESCRIBA,1961
GABRIEL GARCIA MARQUEZ,LA HOJARASCA,1955
JUAN RULFO,PEDRO PARAMO,1955
JUAN RULFO,EL LLANO EN LLAMAS,1953
MARIO BENEDETTI,LA BORRA DEL CAFE,1992
MARIO BENEDETTI,LA TREGUA,1960
OCTAVIO PAZ,SALAMANDRA,1962
OCTAVIO PAZ,PIEDRA DEL SOL,1957
OCTAVIO PAZ,LUNA SILVESTRE,1933
Manejar Columnas
Si buscamos mostrar las columnas del titulo y del año de publicación.
tusysadmin@localhost:~$ cut -f 2,3 -d \, escritores.csv
EL LLANO EN LLAMAS,1953
PEDRO PARAMO,1955
LA MALA HORA,1962
LA TREGUA,1960
LA BORRA DEL CAFE,1992
PIEDRA DEL SOL,1957
LA HOJARASCA,1955
EL CORONEL NO TIENE QUIEN LE ESCRIBA,1961
SALAMANDRA,1962
EL AMOR EN LOS TIEMPOS DEL COLERA,1985
DEL AMOR Y OTROS DEMONIOS,1994
LUNA SILVESTRE,1933
La opción -d es el delimitador, en este caso la coma, con -f establecemos las columnas que se imprimirán. Si queremos que se ordenen por año de publicación podemos redirigir con un sort.
@localhost:~$ cut -f 2,3 -d \, escritores.csv | sort -k2n,2 -t \,
LUNA SILVESTRE,1933
EL LLANO EN LLAMAS,1953
LA HOJARASCA,1955
PEDRO PARAMO,1955
PIEDRA DEL SOL,1957
LA TREGUA,1960
EL CORONEL NO TIENE QUIEN LE ESCRIBA,1961
LA MALA HORA,1962
SALAMANDRA,1962
EL AMOR EN LOS TIEMPOS DEL COLERA,1985
LA BORRA DEL CAFE,1992
DEL AMOR Y OTROS DEMONIOS,1994
Si quisiéramos saber el numero de obras de cada autor en orden alfabético.
tusysadmin@localhost:~$ cut -f 1 -d \, escritores.csv | sort | uniq -c
5 GABRIEL GARCIA MARQUEZ
2 JUAN RULFO
2 MARIO BENEDETTI
3 OCTAVIO PAZ
En ocasiones no recordamos o ignoramos el nombre exacto de un archivo o directorio que requerimos, para solucionarnos estos problemas existe el comando find.
Encontrar archivos que terminan con la extensión .log.
[root@localhost ~]# find / -type f -name *.log
Encontrar el directorio www.
[root@localhost ~]# find / -type d -name www
/var/www