PowerShell Grep

Migel Hewage Nimesha 30 enero 2023
  1. Cmdlet Select-String
  2. Tarea típica de Grep usando PowerShell
  3. Uso de PowerShell Select-String para buscar patrones
PowerShell Grep

¿Adónde va cuando desarrolla código de PowerShell cada vez que necesita buscar contenido dentro de una cadena o un archivo de texto completo? Está familiarizado con la popular utilidad grep si ha usado mucho Linux. La utilidad grep permite a los usuarios encontrar texto usando varios parámetros; sin embargo, no está disponible en Windows. Entonces, en este escenario, tenemos el cmdlet Select-String en PowerShell.

Cmdlet Select-String

Select-String verifica la coincidencia inicial en cada línea de forma predeterminada y luego muestra el número de línea, el nombre del archivo y el texto que pertenece a la línea coincidente. Select-String también puede funcionar con múltiples codificaciones de archivos, por ejemplo, texto Unicode, al determinar el tipo de codificación mediante la marca de orden de bytes (BOM). Select-String supondrá que es un archivo UTF8 si falta la lista de materiales.

A continuación se explican algunos usos del cmdlet Select-String.

Tarea típica de Grep usando PowerShell

Comencemos con un ejemplo. Supongamos que tenemos una cadena con nombres y direcciones, y además, la cadena no está estructurada. Queremos extraer los nombres. Entonces, cómo lo vamos a hacer se explicará a continuación.

||Sara Peiris|| 37, De silva road, Panadura
 --||Tim Gangster||-- 345, Yolks street,KL
 ==|Suz Maker|== 44 Main, Cydney, CA

El texto anterior está asignado a la variable users. Entonces, con el intento, buscará un nombre usando el parámetro -Pattern.

test | Select-String -Pattern 'Sara Peiris'

Producción:

powershell grep 1

Aquí, podemos entender que el método Select-String funcionó pero no devolvió el especificado ya que pasamos la cadena completa. Por lo tanto, intentemos pasar líneas individuales rompiendo con el carácter de nueva línea, ya que cada entrada específica se proporciona en una sola línea.

PS> test = test -split "`n"
PS> test | Select-String -Pattern 'Sara Peiris'

Producción:

powershell grep 2

Aquí podemos ver que devuelve una sola línea. A continuación, debemos buscar una forma de devolver varias líneas.

Uso de PowerShell Select-String para buscar patrones

Aquí, necesitamos encontrar patrones comunes que sean válidos para todas las líneas. Entonces, si tomamos el ejemplo anterior, puede ver que todos los nombres están rodeados de | y los nombres están separados por un espacio. Así que ahora, tomemos este patrón usando la expresión regular y enviémoslo con el parámetro -Pattern.

Select-String ha usado la expresión regular para recuperar cada línea; después de eso, tendré que separar todos los nombres. No necesito las direcciones para cada uno en este momento. Usaremos el atributo Matches de cada objeto coincidente devuelto por Select-String para lograr esto.

PS> test | Select-String -Pattern '\|\w+ \w+\|' | foreach {$_.Matches}

Producción:

powershell grep 3

Ahora puede ver que el atributo Valor tiene los nombres que requerimos, pero todavía están rodeados por el | personaje. Eso es porque la coincidencia de expresiones regulares incluía el | carácter en los nombres.

Los caracteres de tubería aún deben incluirse en el filtro, pero no queremos que se devuelvan como coincidencias. Los grupos Regex son un método. El resultado que desea devolver está entre paréntesis, que indican grupos de expresiones regulares. En esta situación, lo intentaré de nuevo adjuntando la cadena de expresión regular que representa el nombre y el apellido.

PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches}

Producción:

powershell grep 4

El | El carácter se muestra en el valor, pero todo lo que podemos ver es que el grupo se ha convertido en {0,1}, lo que significa que Select-String ha identificado el grupo.

Volveré a insertar la referencia en el for de cada bucle para ver este grupo. Debido a que cada atributo de grupo es un array, podemos referirnos al primer miembro encerrándolo entre paréntesis y luego usando la propiedad Valor.

PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches.Groups[1].Value}

Producción:

powershell grep 5

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.