Expresiones regulares en PowerShell

Para los que piensan en que situación vamos a depender de usar o no expresiones regulares en PowerShell, los invito a seguir leyendo el post ya que vamos a ver varios prácticos que se resuelven utilizando expresiones regulares. Por más que parezca un tema complejo vamos a ver que a medida que empezamos a utilizarlas el camino es más sencillo.

Buscar información

Sobre algunos casos es necesario buscar cierta información, la cual cumple ciertos patrones. En PowerShell tenemos el operador -match que podemos utilizar como muestra el siguiente ejemplo:

En nuestra empresa nombramos nuestros servidores comenzando con SRV y continuando con algunas letras que determinen el rol del servidor y 2 número al final: “ SRVEXCH01” , puede ser un caso de servidor. Para encontrar nombres de servidores dentro de un texto en particular, vamos a definir el siguiente patrón:

$pattern = ‘SRV[A-Z]{2,4}\d{2}’

Vamos a desglosar esta expresión para comprender mejor como trabaja:

  • SRV: Cumple mi primera condición de nomenclatura en donde todos mis servidores comienzan con SRV.

  • [A-Z]{2-4}: Continuando con mi nomenclatura el nombre del servidor debe contener información del rol que contiene y esta información no debe pasar los 4 caracteres (todos en mayúscula).

  • \d{2}: Al final del nombre debe contener un número de 2 dígitos.

Ahora que tenemos el patrón vamos a probar diferentes ejemplos de textos que contienen nombres de servidores que cumplen con el patrón y otros no:

  $text = 'El nombre del controlador de dominio es SRVDC01 y el servidor de DHCP es SRVDHCP03.'
  $pattern = 'SRV[A-Z]{2,4}\d{2}'
  $text -match $pattern

Considerando el código anterior se deja en evidencia el uso del operador -match para comprobar si se encontraban coincidencias con respecto al patrón de búsqueda. Ésta expresión devuelve resultados booleanos ($true o $false). Debido a que el ejemplo que utilizamos devuelve $true, podemos observar el resultado de esa evaluación accediendo a una variable automática llamada $matches

Donde podemos armar algo más estructurado como lo siguiente:

  if ($text -match $pattern) { $matches[0] }

Patrones

Me gustaría compartir algunos ejemplos de patrones según el tipo de búsqueda:

Multiples caracteres

  $text = 'Mi nombre es James Bond'
  $pattern = 'Jame[^abc]'
  $text -match $pattern
  #Resultado: $true

El resultado es true, ya que mi patrón excluye las letras a, b y c como último caracter (James no termina con ninguna de esas letras).

Según la posición

  $text = 'PowerShell es lo peor'
  $text -replace 'peor$','mejor'
  #Resultado: PowerShell es lo mejor

Utilizamos el signo $ para indicar que valide el patrón si se encuentra al final de la línea.

Select-String

Pero tenemos un inconveniente, que capaz no lo notaron; el resultado solamente devolvió uno de los dos nombres que coincidían, ya que -match solamente devuelve el primer valor verdadero.

¿Que sucede con los casos en donde necesitamos obtener todos los resultados que cumplen con el expresión? En estos casos vamos a utilizar el cmdlet Select-String. Para usar el cmdlet anterio debemos asignar el pattern al parámetro -AllMatches y expandir las propiedades como ejemplifica la siguiente línea:

  $text | Select-String -AllMatches $pattern | select -ExpandProperty Matches | select -ExpandProperty Value

Happy scripting!

Comments