1.2K
Grep es una poderosa herramienta de línea de comandos para buscar archivos de texto para patrones específicos. Se ha convertido en un elemento básico para muchos desarrolladores y administradores de sistemas. Sin embargo, es posible que no tenga acceso a grep de forma nativa si trabaja en un entorno de Windows.
¡No temáis! PowerShell viene al rescate con su comando equivalente llamado Seleccionar cadena. En esta publicación de blog, exploraremos las funcionalidades de Seleccionar cadena y cómo se puede usar como sustituto de grep.
El cmdlet Select-String: descripción general
Seleccionar cadena es un cmdlet en PowerShell que le permite buscar patrones de texto en archivos o cadenas. Proporciona varias funciones que lo convierten en una poderosa herramienta para la búsqueda de texto.
¿Qué puede hacer?
Seleccionar cadena poder:
- Busque cadenas o patrones específicos en archivos.
- Realice búsquedas que distinguen entre mayúsculas y minúsculas o que no distinguen entre mayúsculas y minúsculas.
- Busque todas las coincidencias o solo la primera coincidencia.
- Busque cadenas de la canalización.
- Busque cadenas usando expresiones regulares.
- Proporcione contexto en torno a las cadenas coincidentes.
Parámetros
Seleccionar cadena tiene varios parámetros que se pueden utilizar para personalizar la búsqueda. Analicemos algunos de los parámetros comunes:
- Patrón: especifica el patrón de expresión regular o la cadena que desea buscar.
- Camino: especifica el archivo o los archivos en los que buscar. Puede utilizar comodines para especificar varios archivos.
- Todos los partidos: Devuelve todas las coincidencias encontradas en un archivo en lugar de solo la primera coincidencia en cada línea.
- Distingue mayúsculas y minúsculas: realiza una búsqueda que distingue entre mayúsculas y minúsculas.
- Contexto: especifica el número de líneas de contexto que se incluirán antes y después de cada coincidencia.
- Codificación: especifica la codificación de caracteres de los archivos que se buscan.
- Excluir: especifica uno o más patrones de archivo para excluir de la búsqueda.
- Incluir: especifica uno o más patrones de archivo para incluir en la búsqueda.
- Lista: muestra solo los archivos que contienen una coincidencia en lugar de las líneas coincidentes.
- multilínea: trata la entrada como una sola cadena con varias líneas.
- Tranquilo: suprime la salida y solo devuelve un valor booleano que indica si se encontró una coincidencia.
- Partida simple: realiza una coincidencia de cadena simple en lugar de usar expresiones regulares.
- No coincide: excluye las coincidencias que coinciden con el patrón especificado.
Ahora, profundicemos en algunos casos de uso específicos de Seleccionar cadena.
Encontrar cadenas de archivos
Uno de los casos de uso más comunes de Seleccionar cadena es buscar cadenas específicas en archivos. Puede proporcionar una ruta de archivo o un patrón comodín para buscar varios archivos simultáneamente.
En este ejemplo, tengo dos archivos CSV llamados datos_usuario_01.csv y datos_de_usuario_02.csv, que contiene datos de usuario ficticios. Puede descargar estos archivos de muestra de este Esencia.
Por ejemplo, para encontrar las ocurrencias de la palabra “olivia” en todos los archivos CSV dentro de un directorio, puede usar el siguiente comando:
Select-String -Path "*.csv" -Pattern "olivia"
Este comando equivalente de PowerShell grep mostrará las líneas coincidentes, el nombre del archivo y el número de línea.
Nota. Seleccionar cadena trata el patrón de búsqueda como un patrón RegEx de forma predeterminada. Para realizar una búsqueda simple (sin RegEx), use el -Búsqueda simple cambiar. Este modificador le dice al comando que trate el patrón de búsqueda como una cadena estática y no evaluará las expresiones.
Encontrar todas las coincidencias
El Seleccionar cadena cmdlet busca cada línea y devuelve solo la primera coincidencia en un archivo de forma predeterminada. Si desea recuperar todas las coincidencias, puede especificar el -Todos los partidos interruptor, que es particularmente útil cuando se buscan patrones que pueden ocurrir varias veces dentro de una línea.
Este comando de ejemplo devuelve todas las coincidencias de la palabra «olivia» en el archivo.
Select-String -Path "*.csv" -Pattern "olivia" -AllMatches
Como puede ver, las coincidencias incluyen el nombre y parte de la dirección de correo electrónico.
Tal vez desee encontrar usuarios en el archivo cuyo dominio de correo electrónico es «pinguino.com”
Select-String -Path .\*.csv -Pattern "penguin.com"
¿Qué hay de encontrar a todos los usuarios en California?
Select-String -Path .\*.csv -Pattern "California"
Ejecución de una búsqueda que distingue entre mayúsculas y minúsculas
Por defecto, Seleccionar cadena realiza una búsqueda que no distingue entre mayúsculas y minúsculas. Sin embargo, si necesita realizar una búsqueda que distinga entre mayúsculas y minúsculas, puede utilizar el -Distingue mayúsculas y minúsculas parámetro. Por ejemplo, para buscar la palabra “olivia” distinguiendo entre mayúsculas y minúsculas, puede usar lo siguiente:
Select-String -Path "*.csv" -Pattern "olivia" -AllMatches -CaseSensitive
Este comando equivalente de PowerShell grep solo devolverá las coincidencias exactas con la misma mayúscula. Como puede ver a continuación, la búsqueda ignoró las instancias de la palabra «olivia“porque no coincide con el patrón de búsqueda”olivia”.
Búsqueda de cadenas de objetos de canalización
Una de las ventajas de Seleccionar cadena es su capacidad para aceptar entradas de la canalización. Puede combinarlo con otros cmdlets para realizar operaciones más complejas. Pero recuerda que sólo aquellos objetos con el Encadenar() método son válidos. ¿Qué quiere decir esto?
No todos los objetos tienen la Encadenar() método. Por ejemplo, el cmdlet Get-Service genera un objeto que no tiene el Encadenar() método.
Pero puede convertir el objeto en una cadena antes de pasarlo al Seleccionar cadena tubería. Puedes hacerlo usando el fuera de cadena cmdlet antes del comando equivalente de PowerShell grep.
# Convert the output to a single multi-line string object
<cmdlet> | Out-String
# Convert the output to multiple single-line string objects
<cmdlet> | Out-String -Stream
Por ejemplo, este comando convierte la salida Get-Service en un solo objeto de varias líneas y encuentra todas las instancias de ‘aproximadamente‘.
Get-Service -ErrorAction SilentlyContinue | Out-String | Select-String -Pattern 'appx' -AllMatches
Como puede ver, el resultado resaltó las instancias de ‘appx’ pero también mostró las líneas que no coincidían.
Para mostrar solo las líneas con instancias coincidentes, use Fuera de cadena -Stream parámetro antes de pasar el objeto al equivalente de PowerShell grep Seleccionar cadena dominio.
Get-Service -ErrorAction SilentlyContinue | Out-String -Stream | Select-String -Pattern 'appx' -AllMatches
Nota. Consulte nuestra guía sobre cómo escribir salida en la consola de PowerShell.
Encontrar cadenas con contexto
Además de recuperar líneas coincidentes, Seleccionar cadena también proporciona la capacidad de incluir contexto alrededor de las líneas coincidentes. El -Contexto El parámetro le permite especificar el número de líneas que se incluirán antes y después de la línea coincidente.
Por ejemplo, este comando encuentra la cadena que coincide con la dirección de correo electrónico. El -Contexto 3 El parámetro incluirá tres líneas de contexto alrededor de las líneas coincidentes.
Select-String -Path .\*.csv -Pattern "liamstewart@koala.com" -Context 3
Si desea mostrar diferentes números de líneas antes y después de la coincidencia, como 1 línea antes y 2 líneas después, puede agregar otro valor entero al parámetro.
Select-String -Path .\*.csv -Pattern "liamstewart@koala.com" -Context 1, 2
En este ejemplo, el -Contexto 1,2 parámetro incluido 1 antes y 2 después líneas de contexto.
Este comando equivalente de PowerShell grep es útil cuando se revisan los registros en busca de errores. El -Contexto El parámetro puede proporcionar contexto (lo que sucedió antes y después del error) y ayudarlo a solucionar problemas.
Encontrar cadenas con patrones RegEx
Seleccionar cadena también tiene un grep de PowerShell equivalente a la búsqueda con expresiones regulares, lo que permite una coincidencia de patrones más avanzada. Aquí hay algunos ejemplos del uso de expresiones regulares.
Dirección de correo electrónico
Para buscar direcciones de correo electrónico dentro de un archivo, puede usar el siguiente patrón:
$emailAddressPattern = '\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b'
Select-String -Path .\*.csv -Pattern $emailAddressPattern
Número de seguro social
Nuestros archivos CSV de muestra también contienen el Número de Seguro Social para cada usuario ficticio. Para buscar Números de Seguro Social (SSN), puede usar el siguiente patrón:
$ssnPattern = '\b\d{3}-\d{2}-\d{4}\b'
Select-String -Path .\*.csv -Pattern $ssnPattern
Dirección IP
Para buscar direcciones IP, puede utilizar el siguiente patrón:
$ipPattern = '\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b'
Select-String -Path .\*.csv -Pattern $ipPattern -AllMatches
Como puede ver, el comando Select-String equivalente a grep de PowerShell coincidió con todas las instancias de direcciones IP. ¿Qué sucede si desea encontrar direcciones IP públicas y privadas por separado?
Aquí está el patrón RegEx para direcciones IP privadas válidas.
$privateIpPattern = '\b(?:10|172\.(?:1[6-9]|2\d|3[01])|192\.168)\.\d{1,3}\.\d{1,3}\b'
Select-String -Path .\*.csv -Pattern $privateIpPattern -AllMatches
Aquí está el patrón RegEx para direcciones IP públicas válidas.
$publicIpPattern = '\b(?!(?:10|172\.(?:1[6-9]|2\d|3[01])|192\.168)\.\d{1,3}\.\d{1,3}\b)\b(?:(?:\d{1,3}\.){3}\d{1,3})\b'
Select-String -Path .\*.csv -Pattern $publicIpPattern -AllMatches
Conclusión
Si bien es posible que Windows no tenga el nativo grep comando, tiene un cmdlet Select-String equivalente a PowerShell grep excelente.
Con sus diversos parámetros y características, Seleccionar cadena le permite realizar búsquedas de texto en archivos o cadenas, manejar búsquedas que distinguen entre mayúsculas y minúsculas, encontrar todas las coincidencias, buscar usando expresiones regulares e incluso proporcionar contexto alrededor de las líneas coincidentes.
Por lo tanto, la próxima vez que se encuentre en un entorno de Windows y necesite buscar cadenas específicas, intente Seleccionar cadena!