Puede que en algún momento necesitemos pasar una variable obtenida en un script al comando SED, para realizar algún cambio en archivos. Para el siguiente ejemplo, utilizaremos un archivo llamado «prueba.txt», el cual contiene los siguientes datos:
Shell
1
2
3
4
5
6
7
8
uno
dos
tres
uno
dos
cuatro
cinco
dos
Necesitamos cambiar el valor «dos» por «seis». La única forma que me ha resultado para realizarlo es utilizando las comillas dobles y simples como se indica en el siguiente SCRIPT :
Shell
1
2
3
#!/bin/bash
a="seis"
sed-e's/dos/'"$a"'/g'prueba.txt>>nueva.txt
Al lanzar este SCRIPT nos generar un nuevo archivo (nueva.txt) con los siguientes datos :
Shell
1
2
3
4
5
6
7
8
uno
seis
tres
uno
seis
cuatro
cinco
seis
Para realizar el cambio directamente en el archivo, se puede realizar mediante el lenguaje PERL, con la siguiente instrucción :
Este script se puede utilizar para verificar el estado de algún componente y alertar en la consola NAGIOS. Para este ejemplo se asume que una salida «0» (cero) es que el componente esta correcto. Por esto si el archivo no existe, la salida será un «0» (cero). Para cualquier otro tipo de código, la consola NAGIOS mostrara alguna alerta en particular para tomar acciones correctivas.-
Ejemplo para sumar el tamaño total ocupado por los ficheros de un directorio:
Shell
1
ls-l/var/log/httpd|awk'{ sum += $5 } END { print sum }'
Podemos hacer mas flexible la suma de columnas en AWK∞ añadiendo una condición, en este ejemplo limitamos la suma del tamaño de los ficheros a aquellos en los que el usuario «apache» sea el propietario del mismo:
Shell
1
ls-l/var/log/httpd|awk' $3 == "apache" { sum += $5 } END { print sum }'
Tip! Obtener el tamaño total ocupado por un determinado tipo de ficheros: con find filtramos por el tipo de extensión, con esta obtenemos el tamaño total de cada fichero y finalmente hacemos la suma con AWK:
Shell
1
awk'/Invalid user/ { count+=1 } END { print count }'/var/log/secure
También podemos utilizar AWK para sacar la media de los valores que sumamos en una columna dividiendo el total entre NR (Number of Records). Ejemplo para obtener el RSS medio que consumen los procesos nginx:
Shell
1
psaux|grepnginx|awk'{ sum += $6 } END { print "Average = ", sum/NR }'
Ejemplo para imprimir con AWK un determinado rango de columnas, en este caso se procesa un log de Apache para imprimir únicamente el contenido entre la primera y quinta columna:
Utilizando NF (Number of Fields, número de campos en la línea actual) podemos imprimir el contenido desde una determinada columna hasta el final, en este ejemplo analizamos el log del servicio CRON para imprimir el último campo (que se corresponde al comando ejecutado), posteriormente lo filtramos con sort + uniq para listar de mayor a menor la frecuencia de los crontabs que mas se ejecutan:
Con este sencillo hack para AWK∞ podemos imprimir el contenido entre dos determinados patrones; Por ejemplo, vamos a analizar un caso donde nos interesa extraer el contenido que se encuentra entre los caracteres [ y ]:
Shell
1
2
3
4
5
6
7
8
9
10
11
$catexample.txt
[noop]anticipatory deadline cfq
noop anticipatory deadline[cfq]
noop anticipatory[prueba
multilinea]
$awk'$0=$2'FS=[RS=]example.txt
noop
cfq
prueba
multilinea
Establecemos la variable FS (Field Separator, o separador de campos, similar al IFS de BASH∞) al valor [. Es decir, FS contiene el primer patrón.
Al utilizar [ como FS tendremos el contenido separado en X partes: la variable $1 contendrá lo que se queda a la «izquierda» del patrón, $2 contiene lo que queda a la derecha, y así sucesivamente. Con la asignación $0=$2 la línea completa pasa a tener el valor que está a la «derecha» del patrón que hemos utilizado como FS.
Utilizamos RS=[ (Input Record Separator) para marcar el final del contenido que buscamos, así cuando AWK∞ se encuentra con el patrón ] lo toma como el final del contenido, es decir, RS contiene el segundo patrón.
En este otro ejemplo, vamos a extraer las cadenas que se encuentran entre las etiquetas HTML
Shell
1
<ahref=" y ">
de la página de un usuario del servicio Twitter, de modo que obtendremos un listado de enlaces que este ha publicado:
El comando «eval» indica al shell que vuelva a analizar la línea. Esto puede ser útil si está asignando un valor que tiene el mismo nombre que una variable. En el ejemplo siguiente tratamos de asignar var2 con var1 y luego mostrar nuestra salida.
Shell
1
2
3
4
5
#!/bin/bash
var1="First"
var2=var1
echo'$'$var2
eval echo'$'$var2
Al ejecutar este script, obtendriamos el siguiente resultado :
Shell
1
2
3
Name of script./script03.sh
$var1
First
En el ejemplo anterior, observe que la salida del primer comando de eco emitió «$ var1», sin embargo, cuando utilizamos el comando «eval» pudimos mostrar nuestro valor correctamente.
¿Te ha servido este sitio alguna vez? Cada script, cada línea de ayuda aquí es fruto de horas de trabajo y pasión por compartir. Si alguna vez resolviste un problema gracias a esta página, considera hacer una donación. Tu aporte —por pequeño que sea— mantiene vivo este proyecto y me impulsa a seguir creando.