Análisis de datos en texto

      No Comments on Análisis de datos en texto

En la entrega anterior, creamos un sistema de monitoreo que nos iba guardando información de performance de un equipo durante dos días. Esa información se generaba y agregaba a un archivo de texto cada diez minutos. Al terminar la tarea, como pueden imaginar, el archivo de texto contenía muchísimos datos.

Hoy vamos a ver como simplificar el análisis de tanta información y de paso jugaremos un poco con Regex y Arrays.

analisis2

(gc .\monitoreo.txt).count
Recordemos que Get-Content (gc) trabaja linea por linea en un archivo de texto, así que cuando usamos la propiedad .count nos da 4550 lineas.

(gc .\monitoreo.txt -Delimiter $(“=”*48)).count
Lo interesante aquí es el uso del parámetro -Delimiter. Es buen momento para recordar que al crear la función Get-processperf, usamos un pequeño truco que explicamos como “algo estético para mostrar el equipo actual”. Ese truco nos servia para dividir los reportes que genera la función en una linea de 48 caracteres “=”. Esta linea es la que vamos a utilizar ahora dividir el archivo de texto en reportes en lugar de linea por linea. Esta vez contamos los reportes y sabemos que tenemos 183

(gc .\monitoreo.txt -Delimiter $(“=”*48)).GetType()
Una vez que “delimitamos” el archivo de texto en reportes, verificamos que estamos trabajando con un Array de objetos. Como en todo Array, podemos elegir uno de los objetos usando su indice y ver que tenemos:

(gc .\monitoreo.txt -Delimiter $(“=”*48))[175]
Podemos comprobar que cada objeto es un reporte. Ahora nos queda hacer algo útil con esta división

analisis5

gc .\monitoreo.txt -Delimiter $(“=”*48) | sls “% Uso total CPU     (\d+)” | ? {$_.matches.groups[1].value -gt 50}

Ahora si se puso interesante. Expliquemos un poco de a partes:

gc .\monitoreo.txt -Delimiter $(“=”*48)
Como explicamos anteriormente, dividimos el archivo de texto en reportes

| sls “% Uso total CPU     (\d+)”
Lo interesante aquí, no es que busquemos la linea “% Uso total CPU     (\d+)” en cada reporte, porque efectivamente esa linea o regex va a estar en cada uno; sino que encerré a la parte numérica del regex entre paréntesis (\d+).

| ? {$_.matches.groups[1].value -gt 50}
A través del Where-Object (?), filtramos solamente aquellos reportes donde la parte numérica sea mas grande (-gt) que 50, Veamos paso a paso y recordemos este método que ya utilizamos en http://www.winteltips.com/2016/05/07/regex-type-en-powershell/

$_.matches.groups  la propiedad matches nos permite usar ambos matches. La parte de texto “% Uso total CPU    ” con index 0 y la parte numérica (\d+) con index 1. Elegimos  obviamente el index 1 y nos quedamos solamente con el valor
Una vez que conseguimos el valor, lo podemos comparar contra 50 (por ejemplo) y eso nos traerá solamente aquellos reportes que muestren un porcentaje de uso de procesador mayor al 50%. En este caso, de 183 reportes, solo 2 estuvieron arriba de la mitad del uso de CPU.

Hoy vimos un ejemplo pequeño pero muy poderoso del uso de matches y regex para analizar, filtrar, dividir y elegir un archivo de texto con reportes.

Espero que les de ideas para resolver y simplificar sus trabajos!

Saludos, Mauro.

 

Leave a Reply

Be the First to Comment!

Notify of
avatar
wpDiscuz