verificación google

Mostrando entradas con la etiqueta bash. Mostrar todas las entradas
Mostrando entradas con la etiqueta bash. Mostrar todas las entradas

martes, 10 de julio de 2018

Contar lineas desde linux en /bin/bash con el comando wc

Seguro que en muchas ocasiones has necesitado contar lineas desde la consola de linux. Yo en alguna ocasión (antes de conocer el comando wc) he copiado desde el terminal para pegar en un calc o alguna otra aplicación de más alto nivel para contar un resultado. Pero puede que esto no lo tengas siempre disponible y sabemos que siempre es mucho más rápido realizar operaciones directamente en la linea de comandos.

Contar las líneas de un fichero con el comando wc

Los usuarios de GNU/Linux disponemos del comando wc (sigla de Word Count). Este comando nos permite contar las líneas (entendiendo como tal el número de caracteres nueva línea), bytes o palabras.

Para contar las líneas, simeplemente ejecutamos:
wc -l <fichero>
En <fichero> se introduce el nombre o nombres de los archivos en los que queremos efectuar el recuento. Cuando son varios los archivos, el comando devuelve, además, una línea resumen con la suma de los conteos efectuados.

Contar palabras de un fichero con el comando wc

Podemos también utilizar el comando wc para contar palabras, en cuyo caso se consideran como tal las secuencias de longitud no-nula delimitadas por espacios o directamente caracteres. En este caso, la llamada  sería:
wc -w 1<fichero>
Otras opciones interesantes son el uso de los modificadores -c y -m, que te devuelven el número de bytes y/o caracteres del archivo, respectivamente. Hay que destacar que el carácter de fin de línea también se cuenta. Para terminar destacamos el modificador -L, que nos devuelve la longitud máxima de línea.

Contar salida de un comando con wc

Esta será posiblemente la opción que más utilizo personalmente cuando necesito utilizar el comando wc. Consiste en desviar la salida de un comando utilizando tuberías (pipes) a la entrada del siguiente comando, en este caso wc.

Por hacer un ejemplo muy simple, en lugar de contar las lineas de un fichero utilizando:
wc -l mifichero.txt
También podríamos utilizar:
cat mifichero.txt | wc -l
Estos dos comandos realizarán la misma operación; contar el número de lineas del fichero mifichero.txt, pero con esta funcionalidad podríamos realizar operaciones mucho más interesantes. Podríamos crearnos un script que realice distintos procesos en su interior y posteriormente contar el resultado.
./miscript.bash | wc -l

Otras opciones

Si empleamos wc sin archivos de entrada, el conteo se hará sobre la entrada estándar y se contará sobre lo que escribamos en consola. para salir de este modo, se pulsará Ctrl+D y el programa nos devuelve los valores que hemos pedido al invocar el comando.

Por último, os indico que si invocamos el comando sin opciones de conteo (contar las líneas, las palabras, etc), el comando nos devolverá directamente cuatro columnas: la cuenta de palabras, de líneas y de bytes totales del archivo.

martes, 19 de junio de 2018

Buscar y reemplazar texto en bash

En muchas ocasiones me he encontrado con la necesidad de hacer un buscar reemplazar en el bash de linux. Hay muchas opciones para hacerlo, comentaré aquí algunas de las que yo utilizo por si a alguien la es de utilidad.

Utilizar editor nano desde bash para buscar y reemplazar un texto

La primera opción es utilizar un editor de texto cualquiera para hacer un buscar y reemplazar, yo utilizo nano por lo fácil y rápido que es. Te permite abrir fichero de texto muy pesados sin cargar demasiado tu equipo.

Una vez estas en nano simplemente presionas la combinación de teclas ctrl + w para buscar y después ctrl + r para reemplazar, esto te pedirá primero el texto a buscar, después el texto a reemplazar y para terminar preguntará si quieres reemplazar todas las coincidencias o únicamente la primera.





Una buena opción; crear un script /bin/bash para buscar y reemplazar un texto

Esta opción es muy útil cuando necesitamos hacer un buscar y reemplazar automatizado por ejemplo en un fichero de configuración. Yo lo utilizo en ficheros de configuración de apache para virtualhost, tengo una plantilla y cuando tengo que crear un nuevo virtualhost lo creo con un script automatizado de este estilo.
#!/bin/bash
primeraCadena="Amo con locura a mi hijo y a mi mujer."
segundaCadena="familia"
echo "${primeraCadena/hijo y a mi mujer/$segundaCadena}" 
Este script buscará en la cadena base "Amo con locura a mi hijo y a mi mujer." el texto "hijo y a mi mujer" y lo reemplazará por "familia", para después imprimir el resultado "Amo con locura a mi familia".

Esto puede ser útil pero cuando queremos hacer un buscar reemplazar en un fichero de configuración normalmente tenemos el mismo nombre en muchos sitios que tenemos que reemplazar (ficheros de configuración, ruta de directorios, nombre de dominios...). Para esto dejo aquí este pequeños script:
#!/bin/bash
apache=`cat apache.conf`
echo "${apache//instancia/$1}"
En primer lugar cargamos el fichero apache.conf en una variable, hay que destacar que las comillas utilizas son las comillas de ejecución y no las comillas de cadena de texto.

Después procedemos a reemplazar todas las palabras "instancia" por el primer parámetro que le pasamos en la ejecución del fichero.

El script tendríamos que ejecutarlo de la siguiente forma:
./buscar_reemplazar.bash nuevaInstancia
Su ejecución nos devolverá el contenido del fichero que necesitaremos para apache reemplazando la palabra "instancia" del fichero plantilla por "nuevaInstancia".

La opción más rápida; utiliza el comando sed para buscar y reemplazar textos

El comando sed es ampliamente utilizado en linux y lo puedes utilizar para escribir de forma sencilla y rápida una linea de comando para hacer un buscar y reemplazar en un fichero de texto.
sed -i 's/antigua/nueva/g' prueba.txt
Directamente con este simple comando buscará en el fichero prueba.txt todas las coincidencias con "antigua" y las reemplazará por "nueva". El resultado quedará guardado en el mismo fichero gracias al modificador " -i ".

Si prescindimos de este modificador obtendremos el resultado por la salida estandar de la consola. Y podemos desviar éste resultado a un fichero.
sed 's/antigua/nueva/g' prueba.txt > resultado.txt

miércoles, 30 de octubre de 2013

Calcular día par o impar #!/bin/bash

Hace poco necesité una acción dentro de un script que se ejecutase únicamente los días pares del calendario. Calculando el módulo 2 del número del día se puede calcular fácilmente.
#!/bin/bash
dia=`date +%_d`
check=$(($dia % 2))
if [ $check = 0 ]; then
        echo "es un día par";
fi

miércoles, 7 de diciembre de 2011

Múltiples consolas en segundo plano

Muchas veces he pensado en escribir este artículo y de hoy no pasa. Nunca recuerdo este comando y siempre pierdo un tiempo preciso es buscar y recordar como funciona. Y es realmente útil cuando tienes que dejar un proceso que previsiblemente tardará mucho tiempo en terminar y... no te fías de la conexión con el servidor ... se puede ir luz y el equipo desde el que estás conectado no tiene SAI... o simplemente te quieres conectar por SSH al servidor, lanzar el proceso y cerrar la conexión. Para hacer esto utilizaremos el comando "screen". Con el modificador "-dmS " vamos a crear "el terminal" desde el que lanzaremos los procesos en segundo plano. Podemos poner cualquier palabra, yo recomiendo que se utilice algo descriptivo para el fin que se utilizará. Por ejemplo si queremos mover las copias de seguridad que pesan procecientos GB de un disco a otro, podríamos llamar al terminar "ProcesoMueveCopiasSeguridad", así quedaría el comando:
screen -dmS ProcesoMueveCopiasSeguridad
Ahora su hacemos un "ps aux" podemos ver el proceso corriendo. Para acceder al terminar virtual, ejecutamremos:
screen -r ProcesoMueveCopiasSeguridad
Y si ejecutamos un "ps aux --forest" podemos ver que ahora el "ps" se está ejecutando desde la consola correspondiente al screen. Ahora si se corta la comunicación con el servidor no tendremos problemas, porque el proceso que lancemos no dependerá del proceso de nuestra conexión. Ahora bien, ¿Cómo volvemos a nuestro terminal anterior, el terminal que creamos al conectarnos? Pues simplemente pusando "ctrl+a+d" y volveremos al terminal anterior.

lunes, 6 de septiembre de 2010

Diccionario Hexadecimal

He creado un script en bash para generar un diccionario en Hexadecimal. El script genera todas las combinaciones posibles para 128bit en Hexadecimal.

El resultado son todas las combinaciones posibles para 32 dígitos de en Hexadecimal, aún no he probado sacar el volcado a un fichero para ver lo que ocupa.

for a in {a..f}{0..9} {0..9}{a..f}; do # 4bit
for b in {a..f}{0..9} {0..9}{a..f}; do # 8bit
for c in {a..f}{0..9} {0..9}{a..f}; do # 12bit
for d in {a..f}{0..9} {0..9}{a..f}; do # 16bit
for e in {a..f}{0..9} {0..9}{a..f}; do # 20bit
for f in {a..f}{0..9} {0..9}{a..f}; do # 24bit
for g in {a..f}{0..9} {0..9}{a..f}; do # 28bit
for h in {a..f}{0..9} {0..9}{a..f}; do # 32bit
for i in {a..f}{0..9} {0..9}{a..f}; do
for j in {a..f}{0..9} {0..9}{a..f}; do
for k in {a..f}{0..9} {0..9}{a..f}; do
for l in {a..f}{0..9} {0..9}{a..f}; do
for m in {a..f}{0..9} {0..9}{a..f}; do
for n in {a..f}{0..9} {0..9}{a..f}; do
for o in {a..f}{0..9} {0..9}{a..f}; do
for p in {a..f}{0..9} {0..9}{a..f}; do # 64bit
for q in {a..f}{0..9} {0..9}{a..f}; do
for r in {a..f}{0..9} {0..9}{a..f}; do
for s in {a..f}{0..9} {0..9}{a..f}; do
for t in {a..f}{0..9} {0..9}{a..f}; do
for u in {a..f}{0..9} {0..9}{a..f}; do
for v in {a..f}{0..9} {0..9}{a..f}; do
for w in {a..f}{0..9} {0..9}{a..f}; do
for x in {a..f}{0..9} {0..9}{a..f}; do
for y in {a..f}{0..9} {0..9}{a..f}; do
for z in {a..f}{0..9} {0..9}{a..f}; do
for aa in {a..f}{0..9} {0..9}{a..f}; do
for ab in {a..f}{0..9} {0..9}{a..f}; do
for ac in {a..f}{0..9} {0..9}{a..f}; do
for ad in {a..f}{0..9} {0..9}{a..f}; do
for ae in {a..f}{0..9} {0..9}{a..f}; do
for af in {a..f}{0..9} {0..9}{a..f}; do # 128bit
echo $a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z$aa$ab$ac$ad$ae$af;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;
done;


Cuidado con lo que utilizáis este diccionario, porque podría utilizarse para descifrar redes Wifi con encriptación WPA.

Lo "normal" es que estas redes tengan únicamente 64bit de encriptación.

martes, 9 de junio de 2009

Encender y Apagar máquinas virtuales en el inicio del sistema

Con este script podrás iniciar y apagar todas las máquinas virtuales de tu granja de servidores virtuales VirtualBox, sin preocuparte de corromper las máquinas virtuales al apagar la máquinas hospedadora.

Utilizo -type vrdp para no lanzarlas sobre ningún entorno gráfico. Las consolas serán accesibles desde la red.

Para apagar las máquinas windows utilizo el comando net rpc SHUTDOWN -t 0 -C "Apagado desde el servidor de maquinas vituales" -f -I xxx.xxx.xxx.xxx -U Administrador%password para el apagado desde la red de una máquina windows. Me ha pasado que en algunas máquinas no he sido capaz de que funcione, pero en otras sí. No soy un experto en windows así que si alquien sabe porqué puede pasar esto que deje un comentario.

Las máquinas Gnu/Linux normalmente se apagarán correctamente con la opción VBoxManage controlvm Suse10serverOracle10g acpipowerbutton.

No os preocupéis, he pensado en todo. Las maquinas tardan un tiempo en apagarse, el script está programado para esperar 60 segundos. Y después guardará el estado de todas las máquinas virtuales, por si alguna no se apagó correctamente (VBoxManage controlvm Win2003serverMSSql savestate).

Definir el fichero /etc/init.d/maquinasvirtuales.bash:
#!/bin/bash
echo "Script de iniciado/apagardo de máquinas virtuales"
case $1 in
start)
echo "Iniciando máquinas vituales, espere a que inicien los sistemas..."
VBoxManage startvm Win2003serverMSSql -type vrdp
VBoxManage startvm Suse10serverOracle10g -type vrdp
VBoxManage startvm Debian5Nagios -type vrdp
;;
stop)
echo "Parando máquinas vituales, espere a que termien de apagar los sistemas..."

# apagar windows desde la red (Win2003serverMsSQL)
net rpc SHUTDOWN -t 0 -C "Apagado desde el servidor de maquinas vituales" -f -I xxx.xxx.xxx.xxx -U Administrador%password

# apagar como si pulsaras una vez el botón de apagar (aparagá correctamente)
VBoxManage controlvm Suse10serverOracle10g acpipowerbutton
VBoxManage controlvm Debian5Nagios acpipowerbutton

# espernado un tiempo prudencial para dar tiempo a las maquinas virtuales a que se apaguen
for i in `seq 1 60`; do
sleep 1
echo -n "."
done

# si no se apagaron las máquinas guardamos su estado, así no corromperemos los sistemas de ficheros

VBoxManage controlvm Win2003serverMSSql savestate
VBoxManage controlvm Debian5Nagios savestate
VBoxManage controlvm Suse10serverOracle10g savestate

echo "sistemas apagados"
;;
restart)
/etc/init.d/maquinasvirtuales.bash stop
/etc/init.d/maquinasvirtuales.bash start
;;
*)
echo "Usa: /etc/init.d/maquinasvirtuales.sh {start|stop|restart}"
;;
esac

martes, 5 de mayo de 2009

vlc reproduce musica desde linea de comandos

Un buen reproductor de música para la linea de comandos de GNU/Linux puede ser vlc. Lo he estado utilizando y es perfecto para no sobrecargar el sistema con reproductores lentos.

Para ejecutarlo simplemente. Desde ahí podemos ir buscando las canciones que queramos reproducir.
vlc -I ncurses
Lo mejor creo que puede ser hacr un script pasándole como argumento los ficheros que queramos reproducir. Es decir el directorio donde almacenamos nuestra música.
#!/bin/bash
vlc -I curses /home/jmruiz/musik/*

Como abrir Firefox u otra aplicacion remotamente

Seguro que en muchas ocasiones has necesitado abrir una aplicaciones en otro ordenador para ver la ejecución en local. SSH nos permite esta funcionalidad, pero con algunas restricciones, tenemos que tener instalada la aplicación también en el equipo desde el que lanzado el comando. Ya que utiliza las librería locales para poder ejecutar la aplicación.

Solo necesitamos la IP de la máquina remota y que esta tenga corriendo el servidor SSH y permisos de ejecución para el aplicativo "firefox" para "usuario".
ssh usuario@192.168.254.254 -CX -f firefox
Parece un comando muy tonto, pero muy útil para ver por ejemplo una aplicación Web que únicamente se puede acceder desde el escritorio de la máquina y poniendo "http://localhost". Es decir que Apache solo admite peticiones que venga de la propia máquina.
Con este comando SSH podríamos acceder remotamente a esa aplicación que solo admite peticiones en modo local.

Si piensas un poco verás que puede ser muy útil cuando estás trabajando con más de una subred y necesitas saltar de una a otra.

miércoles, 17 de diciembre de 2008

Borrar copias de seguridad antiguas con bash

Con este script en bash podrás borrar las copias de seguridad antiguas de tu disco duro.

Hay que configurar la ruta donde están el disco duro donde volvamos las copias de seguridad (DirectorioBackup=/BACKUP), una vez configurado esto ya podemos programar su ejecución periódica antes de que se lance la copia de seguridad nueva, para que cuando intente copiar los ficheros tenga espacio.

El script mira el espacio de la última copia de seguridad y irá borrando directorio desde el más antiguo al más moderno, hasta dejar el espacio suficiente para que entre una copia de seguridad con el mismo tamaño que la última copia.
#!/bin/bash
DirectorioBackup=/BACKUP
EspacioMaxQueOcupaUnaCopia=`du -s $DirectorioBackup/* | sort | tail -n1 | awk '{print $1}' `
EspacioDisponibleHDD=`df -P $DirectorioBackup | grep -v -i S.ficheros | awk '{print $4}'`
while [ $EspacioMaxQueOcupaUnaCopia -gt $EspacioDisponibleHDD ]; do
DirectiorABorrar=`ls -t $DirectorioBackup | tail -n1`
rm -fr "$DirectorioBackup/$DirectiorABorrar"
EspacioDisponibleHDD=`df -P $DirectorioBackup | grep -v -i S.ficheros | awk '{print $4}'`
done
Para el correcto funcionamiento del script, el directorio /BACKUP tendrá que almacenar un directorio por copia de seguridad, por ejemplo:
/BACKUP/20081217
/BACKUP/20081216
/BACKUP/20081215
Si el script se encuentra con esta casuística, borrará primero el directorio /BACKUP/20081215 y si aún así no le queda espacio suficiente, borrará /BACKUP/20081216.