Powershell_> Select-string el grep de PS

Hola a todos, hoy toca aprender un poco el cmdlet Select-string, que nos permitirá trabajar con archivos y texto como si estuviésemos trabajando con el famoso “grep”, como siempre empezamos con lo más básico…. veamos sus opciones:

Vaya hay unas cuantas, antes de continuar me he dado cuenta que no he explicado en este post que son los alias, según la documentación de Microsoft:

Un alias es un nombre alternativo para un cmdlet, una función o un archivo ejecutable. Windows PowerShell incluye un conjunto de alias integrados. También puede agregar sus propios alias a la sesión actual y a su perfil de Windows PowerShell.

Los alias nos permitirán escribir menos, sobre todo cuando estamos en consola, aunque no son imprescindibles, pero cuando escribamos un script os recomiendo:

Escribir el nombre del cmdlet completo, es mucho más legible y no os tendréis que aprender ni estar consultando constantemente el alias del comando que queríais utilizar.

A modo de ejercicio, durante este post utilizaremos el alias, pero ¿qué alias tiene Select-String? lo podemos saber con el cmdlet Get-Alias:

Ahora sigamos trabajando, una cosa que tenéis que tener en cuenta al trabajar con sls aka Select-string es que por defecto es case-insensitive, es decir que da igual si escribís es mayúscula o minúscula, lo va a tratar de la misma forma a no ser que se le especifique lo contrario con el parámetro -CaseSensitive. Hagamos una prueba:

Primero muestro el contenido del archivo prueba1.txt y después hay 2 ejemplos:

 select-string -path .\prueba1.txt -Pattern 'apellido'
select-string -path .\prueba1.txt -Pattern 'apellido' -CaseSensitive

Aquí buscamos la palabra apellido dentro del archivo prueba1.txt, y como se observa nos muestra las líneas donde se encuentra el Apellido1 y apellido2, esto es porque como he comentado antes por defecto sls es CaseInsesitive, cuando en el segundo ejemplo le hemos agregado el parámetro -CaseSensitive “solo” nos a mostrado apellido2.

Hasta ahora sólo hemos estado buscando en un archivo, pero supongamos que tenemos varios archivos .txt y estamos buscando uno que tenga la cadena “.com”  ¿cómo lo haríamos?

sls -Path *.txt -Pattern 'com'

He agregado varios archivos a nuestro directorio de pruebas, y el resultado del comando anterior es este… se puede observar el nombredelarchivo:númerolínea:valorlínea. no está mal ¿no? sigamos,  supongamos que en el archivo prueba1.txt, del ejemplo de CaseSensitive, queremos realizar una búsqueda y mostrar no sólo lo que buscamos sino que queremos ver las dos líneas siguientes, esto se realiza con el parámetro -context veamos el ejemplo:

Desde el parámetro de la búsqueda [0] muestra dos líneas más -Context 2 es por eso que nos muestra las 3 líneas, ¿y si queremos obtener las líneas antes de nuestra búsqueda? veamos:

Hemos buscado “web” y le hemos pedido que nos muestre una línea antes, vaya ¿podemos mostrar por ejemplo una línea antes y una después? Claro que si hombre…. vamosssss

Evidentemente también podemos utilizar Expresiones Regulares, probemos:

La expresión \d+ significa cualquier dígito decimal, en cualquier parte del texto, seamos un poco más específicos, vamos a agregarle al inicio de la expresión un ^ qué significará que busque cualquier dígito al principio de la línea quedando la expresión así: ^\d+ y veremos que el resultado cambia.

Ahora vamos a afinar un poco más, en la imagen anterior vemos que la ip está compuesta por 3 dígitos un punto 3 dígitos otro punto 1 dígito y otro punto y 2 dígitos  ¿cómo podriamos realizar esa búsqueda? Pues así:

\d{3} = 3 dígitos
 [.] =.

etc. la secuencia de la sentencia sería busca en todos los archivos .txt el patrón de 3 dígitos un punto 3 dígitos un punto 1 dígito un punto 2 dígitos.

Bueno la cosa se va complicando un poco más,  supongamos que ahora lo que buscamos son direcciones de email, he agregado una en prueba1.txt que es inventado@aprendizdesysadmin.com y ahora vamos a buscarla, para ello utilizaremos \w+ que significa según la documentación de MS , cualquier carácter, así nos encontrará nuestro mail:

PAUSA,  me doy cuenta de que os he mostrado como buscar al principio de un línea pero no os explicado como buscar al final de ella, se hace con \z veamos un ejemplo:

Sencillo verdad, se me olvidaba comentaros que además podemos utilizar select-string para trabajar con la salida de comandos, por ejemplo:

 

Donde podemos “filtrar” el resultado de nuestro netstat -ano buscando ‘LISTENING’ y aquí paramos el post de hoy, más adelante seguiré poniendo más ejemplos ya que este tema da para escribir un libro, lo explicado solo ha sido una pincelada de lo que podemos hacer con nuestro Powershell, como siempre espero que os sea útil y nos ayude a aprender un poquito más…

Otro día más y mejor.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *