¿Existe una utilidad de coincidencia de patrones como GREP en Windows?

179

¿Hay una utilidad similar grepdisponible desde el símbolo del sistema de Windows, o hay una herramienta de terceros para ello?

Chintan Shah
fuente

Respuestas:

238

Hay una herramienta de línea de comandos llamada FINDSTRque viene con todos los sistemas operativos de clase Windows NT (escriba FINDSTR /?en una ventana del símbolo del sistema para obtener más información). No admite todo grep, pero puede ser suficiente para sus necesidades.

Ken Keenan
fuente
77
¡Gracias! No es grep, pero me gusta poder funcionar sin instalar software adicional en las máquinas de otras personas y esto me lo permitirá.
sabio
42
También puede usarlo con el símbolo de la tubería, por ejemplonetstat -n | FINDSTR 3389
harperville
3
@sage, con algo de creatividad, encuentra que funciona exactamente como grep. Consulte este grep para el ejemplo de Windows .
mkyong
2
@mkyong: estoy de acuerdo. No quise sugerir que de alguna manera esté incompleto, solo que es diferente y el uso de más herramientas requiere más trabajo. Dicho esto, findtr es mi herramienta de elección ahora cuando uso las computadoras de otros, pero tengo que actualizar mi memoria con la sintaxis cada vez que la uso.
sabio
1
@gonzobrains: Simplemente no está tan bien documentado. Por lo que puedo decir, siempre ha estado disponible desde el símbolo del sistema de Windows NT; ciertamente, estaba disponible en Windows NT 4, pero no sé sobre Windows 3.5x. El comando fue considerado como un "ciudadano de segunda clase" por Microsoft en ese entonces que muchas utilidades de línea de comandos útiles se han pasado por alto en la documentación ☹️
Ken Keenan
35

PowerShell (incluido de serie en Windows 7 / 2008R2, opcional para XP / 2003 / Vista / 2008) que incluye el select-stringcmdlet para este propósito.

Ricardo
fuente
10
Si bien Select-String (alias: sls) usa expresiones regulares, no admite algunas características básicas como la recursividad de directorios. Para eso necesitas combinar múltiples comandos de PowerShell. Como "dir -R -Include * .txt | sls" ^ My Regex String $ "
yzorg
33

Grep para Windows por GnuWin Project (2014-10-02: Está desactualizado, vea los comentarios a continuación)

Gregor
fuente
1
Este es el grep GnuWin32. No se ha actualizado a la versión más reciente de grep. Para eso tendrás que obtener la versión Cygwin. Ver comentario a continuación.
JPaget
27

Como se mencionó, FindStr funciona bien. ejemplo:

C:> dir | encuentra Windows

11/06/2013 09:55 PM Windows

Universo paralelo
fuente
11

Cygwin grep y más;)

sdu
fuente
2
No tiene que instalar todo el paquete Cygwin para ejecutar Cygwin grep. Solo necesita alrededor de 5 DLL: cygpcre-0.dll, cygpcreposix-0.dll, cygwin1.dll, cygintl-8.dll y cyggce_s-1.dll.
JPaget
Uso Cygwin durante mucho tiempo ... y recientemente trato de sustituirlo por Windows-Linux-Subsystems ... no por mucho tiempo ... VOLVER A CYGWIN ... mucho más rico y menos intrusivo ... solo agregue <cygwin > \ bin a la ruta ... y puede usarlo en cualquier programa en Windows / Batch / Powershell ... en un DOS-Box ... en un Powershell-Box ... etc. etc .--- ¡GRAN HERRAMIENTA! !!
ZEE
11

También encontré una forma más de utilizar la funcionalidad similar a GREP en Windows 7 y superior sin ninguna aplicación adicional para instalar y en sistemas más antiguos puede usar instalar Powershell.

En Powershell , el usuario puede usar Where-Object , tiene un conjunto bastante completo de características que proporciona toda la funcionalidad de GREP y más.

Espero eso ayude.

Chintan Shah
fuente
10

Me sorprende que nadie haya mencionado FINDSTR . No soy grep poweruser, pero findtr hace lo que necesito para filtrar archivos y stdin, con un soporte primitivo de expresiones regulares. Se envía con Windows y todo eso. (Editar: Bueno, alguien mencionó a findtr, es tarde, supongo)

Svend
fuente
55
"nadie ha mencionado FINDSTR" - la "mejor" respuesta es un año mayor y menciona FINDSTR ...
chiccodoro
6

Vale la pena mencionar GnuWin32 , proporciona la versión nativa de Win32 de todas las herramientas estándar de Linux, incluidas grep, file, sed, groff, indent, etc.

Y se actualiza constantemente cuando se lanzan nuevas versiones de estas herramientas.

Diaa Sami
fuente
Ahora parece estar disponible en choclatey, por lo que cinst GnuWin32 trabaja para instalarlo rápidamente.
Stuart Axon
4

En Windows uso Far Manager para la búsqueda de archivos. Licencia BSD, funciona en la consola, ahorra tiempo al escribir parámetros de cmdline. Aquí está su diálogo de búsqueda invocado por Alt-F7.Alt-F7

anatoly techtonik
fuente
4

Actualización: esto no era cierto cuando la pregunta se hizo originalmente, pero ahora Microsoft permite instalar el subsistema de Windows para Linux , y Windows ejecutará grep. En PowerShell, ejecute:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Woodvi
fuente
Lo probé pero me da este error: 'Enable-WindowsOptionalFeature' no se reconoce como un comando interno o externo, un programa operable o un archivo por lotes. Gracias por cierto.
Sandun
Gracias. Probaré eso. ;)
Sandun
3

UnxUtils es un gran conjunto de utilidades de Unix que se ejecutan en Windows. Tiene grep, sed, gawk, etc.

Andy White
fuente
3
UnxUtils no se ha mantenido durante años. Utilice GnuWin32 o Cygwin en su lugar.
JPaget
gnu en windows (gow) es más completo que GnuWin32: github.com/bmatzelle/gow/wiki
Simon D
3

Una herramienta de búsqueda de archivos excelente y muy rápida, Agent Ransack , admite la búsqueda de expresiones regulares. Es principalmente una utilidad GUI, pero también está disponible una interfaz de línea de comandos.

JPaget
fuente
2

En el reskit de Windows hay una utilidad llamada "qgrep". Puede que ya lo tenga en su caja. ;-) También viene con el comando "cola", ¡gracias a Dios!

Jubal
fuente
1

Aunque técnicamente no es grep ni línea de comando, tanto Microsoft Visual Studio como Notepad ++ tienen una muy buena función Buscar en archivos con soporte completo de expresiones regulares. Me encuentro usándolos con frecuencia a pesar de que también tengo la versión CygWin de grep disponible en la línea de comandos.

GBegen
fuente
1

Agregaré mis $ 0.02 a este hilo. dnGREP es una gran herramienta grep de código abierto para Windows que admite deshacer, la integración del explorador de Windows, buscar dentro de archivos PDF, zips, DOC y muchas otras cosas ...

Stankovski
fuente
1

Sí, solo hay un programa para PC con Windows que tiene una GUI sólida y es una utilidad esencial para mí. Trabajo como desarrollador y en cada computadora que he tenido, lo primero es instalar el programa XFind. Fue creado en 1997 y hasta ahora la versión es 1.0 y hasta ahora funciona y es la mejor. Con frecuencia necesito buscar alguna cadena en un " .cs", " .aspx", " .sct" (archivo de código de formulario de Visual FoxPro) o simplemente " . *" Y XFind escanea todos los archivos y me muestra archivos y otra gran cosa es que puedes ver dónde está la cadena en el archivo. XFind también tiene algún tipo de editor. Si se trata de un archivo binario, le mostrará una cadena de búsqueda. Pruébalo y úsalo para siempre si eres desarrollador como yo.

Shixx
fuente
1

Obviamente has recibido muchas recomendaciones diferentes.
Mi elección personal para una utilidad gratuita de terceros es: Agent Ransack
Agent Ransack Download
A pesar de su nombre algo confuso, funciona bien y se puede utilizar de varias maneras para encontrar archivos.

Buena suerte

Dhugalmac
fuente
0

Si no le importa un producto pagado, PowerGREP es mi favorito personal.

David Andres
fuente
0

Recientemente hemos usado PowerGREP para algunas operaciones masivas bastante avanzadas en miles de archivos. Incluyendo la búsqueda de expresiones regulares en el contenido de archivos PDF y la alteración de documentos PDF a gran escala.

Vale la pena si quieres ahorrar tiempo de mano de obra. Puedes probarlo antes de comprar, creo.

Lars Udengaard
fuente
0

Si tiene que usar Windows desnudo, además de la opción Powershell mencionada anteriormente, puede usar VBScript, que tiene un soporte decente de RegEx.

MS también tiene un área de scripting decente en Technet con un montón de ejemplos para administradores.

Rublo de Ron
fuente
0

Simplemente pruebe la utilidad LikeGrep java. Puede ayudarte en muchos casos. Como lo desee, también puede reemplazar parte del texto que se encuentra en los archivos. Garantiza su trabajo en archivos grandes (hasta 8 Gb probados)

Igor
fuente
0

Como se mencionó anteriormente, el proyecto gnuwin32 tiene una versión CLI de Windows de grep.

Si desea algo con una interfaz gráfica, le recomendaría la herramienta (de código abierto) AstroGrep .

bta
fuente
0

Ha pasado un tiempo desde que los usé, pero Borland (Embarcadero ahora) incluyó una línea de comando grep con su compilador C / C ++. Durante algún tiempo, han puesto a disposición su versión 5.5 como descarga gratuita después de registrarse.

GreenMatt
fuente
0

Recomiendo PowerGrep

Tuve que hacer un proyecto de descubrimiento electrónico hace varios años. Descubrí que fisdstrtenía algunas limitaciones, especialmente fisdstr eventualmente fallaría

el script tuvo que buscar en miles de archivos usando un par de docenas de términos / frases de búsqueda.

El grep de Cygwin funcionó mucho mejor , no se ahogaba con frecuencia, pero finalmente fui a PowerGrep porque la interfaz gráfica me hizo mucho más fácil saber cuándo y dónde se bloqueó, y también fue muy fácil de editar en todos los condicionales y resultados que Quise. Finalmente, PowerGrep fue el más confiable de los tres.

Haggisbreath
fuente
0

Sé que es un tema un poco viejo, pero aquí hay otra cosa que puedes hacer. Trabajo en una máquina virtual de desarrollador sin acceso a Internet y espacio libre en disco bastante limitado, así que hice uso de Java instalado en él.

Compile un pequeño programa Java que imprima coincidencias de expresiones regulares en la consola. Coloque el jar en algún lugar de su sistema, cree un lote para ejecutarlo y agregue la carpeta a su variable PATH:

JGrep.java:

package com.jgrep;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JGrep {

    public static void main(String[] args) throws FileNotFoundException, IOException {
        int printGroup = -1;
        if (args.length < 2) {
            System.out.println("Invalid arguments. Usage:");
            System.out.println("jgrep [...-MODIFIERS] [PATTERN] [FILENAME]");
            System.out.println("Available modifiers:");
            System.out.println(" -printGroup            - will print the given group only instead of the whole match. Eg: -printGroup=1");
            System.out.println("Current arguments:");
            for (int i = 0; i < args.length; i++) {
                System.out.println("args[" + i + "]=" + args[i]);
            }
            return;
        }
        Pattern pattern = null;
        String filename = args[args.length - 1];
        String patternArg = args[args.length - 2];        
        pattern = Pattern.compile(patternArg);

        int argCount = 2;
        while (args.length - argCount - 1 >= 0) {
            String arg = args[args.length - argCount - 1];
            argCount++;
            if (arg.startsWith("-printGroup=")) {
                printGroup = Integer.parseInt(arg.substring("-printGroup=".length()));
            }
        }
        StringBuilder sb = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
            sb = new StringBuilder();
            String line = br.readLine();

            while (line != null) {
                sb.append(line);
                sb.append(System.lineSeparator());
                line = br.readLine();
            }
        }
        Matcher matcher = pattern.matcher(sb.toString());
        int matchesCount = 0;
        while (matcher.find()) {
            if (printGroup > 0) {
                System.out.println(matcher.group(printGroup));
            } else {
                System.out.println(matcher.group());
            }
            matchesCount++;
        }
        System.out.println("----------------------------------------");
        System.out.println("File: " + filename);
        System.out.println("Pattern: " + pattern.pattern());
        System.out.println("PrintGroup: " + printGroup);
        System.out.println("Matches: " + matchesCount);
    }
}

c: \ jgrep \ jgrep.bat (junto con jgrep.jar):

@echo off
java -cp c:\jgrep\jgrep.jar com.jgrep.JGrep %*

y agregue c: \ jgrep al final de la variable de entorno PATH.

Ahora simplemente llame jgrep "expression" file.txtdesde cualquier lugar.

Necesitaba imprimir algunos grupos específicos de mi expresión, así que agregué un modificador y lo llamé como jgrep -printGroup=1 "expression" file.txt.

mihail
fuente
0

Me doy cuenta de que es una vieja pregunta, pero encontré esta publicación buscando una respuesta. Y he encontrado uno, así que lo agregué aquí para la memoria colectiva de Internet

Powershell: Módulo Select-String: Microsoft.PowerShell.Utility

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string

y una publicación de blog informativa con ejemplos avanzados: "Cómo" grep "en PowerShell" https://antjanus.com/blog/web-development-tutorials/how-to-grep-in-powershell/

Un ejemplo simple de esa publicación de blog: cat package.json | Select-String -Pattern webpack ls ./src/components/ | Seleccionar cadena de vista de patrón

C:> gato post.md | Select-String -Pattern "^ \ w *:"

blackweta
fuente
0

Usa Cygwin ...

Tiene versiones de 32 y 64 bits
y funciona bien desde Windows 2000 (*)
hasta Windows 10 o Server 2019

Uso Cygwin durante mucho tiempo ...
y recientemente intenté sustituirlo por Windows-Linux-Subsystems ...

no por mucho tiempo ...
volví rápidamente a Cygwin nuevamente ...

mucho más flexible, controlable y rico ...
también menos intrusivo ...

simplemente agregue \ bin a la ruta ...
y puede usarlo en Windows / Batch / Powershell ...
o en un DOS-Box ... o en un Powershell-Box ...

También puede instalar una tonelada de paquetes geniales
que realmente funcionan ... como nginX o PHP ... Incluso uso el paquete Cygwin PHP en mi IIS ...

Como beneficio adicional, también puedes usarlo desde un bash shell ...
(Creo que esta fue la intención original ;-))

ZEE
fuente