Esiste un'utilità di corrispondenza dei modelli come GREP in Windows?


179

Esiste un'utilità simile a quella grepdisponibile dal prompt dei comandi di Windows o esiste uno strumento di terze parti per esso?

Risposte:


238

Esiste uno strumento da riga di comando chiamato FINDSTRfornito con tutti i sistemi operativi di classe Windows NT (digitare FINDSTR /?in una finestra del prompt dei comandi per ulteriori informazioni) Non supporta tutto ciò che grepfa, ma potrebbe essere sufficiente per le tue esigenze.


7
Grazie! Non è grep, ma mi piace essere in grado di funzionare senza installare software aggiuntivo su macchine di altre persone e questo mi permetterà.
salvia il

42
Puoi anche usarlo con il simbolo della pipa, ad esempionetstat -n | FINDSTR 3389
harperville,

3
@sage, con un po 'di creatività, findstr funziona esattamente come grep. Fare riferimento a questo grep per l'esempio di Windows .
mkyong,

2
@mkyong - Sono d'accordo. Non intendevo suggerire che sia in qualche modo incompleto, solo che è diverso e l'utilizzo di più strumenti richiede più lavoro. Detto questo, findstr è il mio strumento preferito ora quando uso i computer di altri, ma devo aggiornare la mia memoria sulla sintassi ogni volta che lo uso.
salvia

1
@gonzobrains: non è così ben documentato. Per quanto ne so, è sempre stato disponibile dal prompt dei comandi di Windows NT, certamente era disponibile in Windows NT 4 ma non conosco Windows 3.5x. All'epoca il prompt dei comandi era considerato un tale "cittadino di seconda classe" da Microsoft che un sacco di utili utilità da riga di comando sono state trascurate nella documentazione ☹️
Ken Keenan,

35

PowerShell (incluso come standard in Windows 7 / 2008R2, opzionale per XP / 2003 / Vista / 2008) che include il select-stringcmdlet a tale scopo.


10
Mentre Select-String (alias: sls) usa espressioni regolari, non supporta alcune funzionalità di base come la ricorsione della directory. Per questo è necessario combinare più comandi PowerShell. Come "dir -R -Include * .txt | sls" ^ My Regex String $ "
yzorg

33

Grep per Windows di GnuWin Project (02-10-2014: è obsoleto, vedere i commenti di seguito)


1
Questo è il grep GnuWin32. Non è stato aggiornato alla versione più recente di grep. Per questo dovrai ottenere la versione di Cygwin. Vedi il commento qui sotto.
JPaget,

27

come detto, findstr funziona bene. esempio :

C:> dir | trova Windows

11/06/2013 alle 21:55 Windows


11

Cygwin grep e altro;)


2
Non è necessario installare l'intero pacchetto Cygwin per eseguire Cygwin grep. Hai solo bisogno di circa 5 DLL: cygpcre-0.dll, cygpcreposix-0.dll, cygwin1.dll, cygintl-8.dll e cyggce_s-1.dll.
JPaget

Uso Cygwin da molto tempo ... e recentemente provo a sostituire i sottosistemi Windows-Linux ... non per molto ... TORNA A CYGWIN ... molto più ricco e meno invadente ... basta aggiungere <cygwin > \ bin per il percorso ... e puoi usarlo a prescindere in Windows / Batch / Powershell ... in DOS-Box ... in Powershell-Box ... ecc. ecc. - OTTIMO STRUMENTO! !!
ZEE,

11

Ho anche trovato un altro modo per utilizzare la funzionalità GREP come in Windows 7 e versioni successive senza alcuna applicazione aggiuntiva da installare e su sistemi più vecchi è possibile utilizzare l'installazione Powershell.

In Powershell , l'utente può usare Where-Object ha un set abbastanza completo di funzionalità che fornisce tutte le funzionalità di GREP e altro ancora.

Spero che sia d'aiuto.


10

Sono sorpreso che nessuno abbia menzionato FINDSTR . Non sono un power user grep, ma findstr fa quello di cui ho bisogno, filtra i file e stdin, con un supporto regex primitivo. Viene fornito con Windows e tutto il resto. (Modifica: beh qualcuno ha menzionato findstr, è tardi credo)


5
"nessuno ha menzionato FINDSTR" - la risposta "migliore" ha un anno in più e menziona FINDSTR ...
chiccodoro

6

GnuWin32Vale la pena menzionare , fornisce la versione nativa Win32 di tutti gli strumenti linux standard, inclusi grep, file, sed, groff, indent, ecc.

Ed è costantemente aggiornato quando vengono rilasciate nuove versioni di questi strumenti.


Ora sembra essere disponibile su choclatey, quindi GnuWin32 lavora per installarlo rapidamente.
Stuart Axon,

4

Su Windows utilizzo Far Manager per la ricerca di file. Licenza BSD, funziona in console, consente di risparmiare tempo nella digitazione dei parametri cmdline. Ecco la sua finestra di ricerca invocata da Alt-F7.Alt-F7


4

Aggiornamento: questo non era vero quando la domanda era stata originariamente posta, ma ora Microsoft consente a uno di installare il sottosistema Windows per Linux e Windows eseguirà quindi grep. In PowerShell, esegui:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

L'ho provato ma dà questo errore: 'Enable-WindowsOptionalFeature' non è riconosciuto come comando interno o esterno, programma eseguibile o file batch. Grazie a proposito.
Sandun,


Grazie. Ci proverò. ;)
Sandun,


3

Una utility di ricerca file eccellente e molto veloce, Agent Ransack , supporta la ricerca di espressioni regolari. È principalmente un'utilità GUI, ma è anche disponibile un'interfaccia da riga di comando.


2

Nel reskit di Windows c'è un'utilità chiamata "qgrep". Potresti averlo già nella tua scatola. ;-) Viene fornito anche con il comando "tail", grazie a dio!


1

Sebbene non sia tecnicamente grep né a riga di comando, sia Microsoft Visual Studio che Notepad ++ hanno un'ottima funzionalità Trova nei file con pieno supporto delle espressioni regolari. Mi ritrovo a usarli frequentemente anche se ho anche la versione CygWin di grep disponibile sulla riga di comando.


1

Aggiungerò i miei $ 0,02 a questa discussione. dnGREP è un ottimo strumento grep open source per Windows che supporta Annulla, l'integrazione di Windows Explorer, la ricerca all'interno di PDF, zip, DOC e un sacco di altre cose ...


1

Sì, esiste un solo programma per PC Windows con una solida GUI ed è un programma essenziale per me. Lavoro come sviluppatore e su ogni computer che ho avuto, per prima cosa installa il programma XFind. È stato creato nel 1997 e fino ad ora la versione è 1.0 e fino ad ora funziona ed è il migliore. Spesso ho bisogno di cercare una stringa in " .cs", " .aspx", " .sct" (file di codice modulo di Visual FoxPro) o semplicemente " . *" E XFind esegue la scansione di tutti i file e mi mostra i file e un'altra cosa fantastica è che puoi vedere dove si trova la stringa nel file. XFind ha anche una sorta di editor. Se è un file binario, ti mostrerà la stringa trovata. Provalo e usalo per sempre se sei uno sviluppatore come me.


1

Ovviamente hai ricevuto molti consigli diversi.
La mia scelta personale per un'utilità gratuita di terze parti è: Agent Ransack
Agent Ransack Download
Nonostante il suo nome un po 'confuso, funziona bene e può essere utilizzato in vari modi per trovare i file.

In bocca al lupo




0

Se non ti dispiace un prodotto a pagamento, PowerGREP è il mio preferito.


0

Recentemente abbiamo utilizzato PowerGREP per alcune operazioni di massa piuttosto avanzate su migliaia di file. Inclusa la ricerca di regex nel contenuto dei file PDF e l'alterazione dei documenti PDF su larga scala.

Vale la pena spendere se si vuole risparmiare tempo dal lavoro manuale. Puoi provarlo prima di acquistare penso.


0

Se devi usare Windows nudo, oltre all'opzione Powershell sopra menzionata, puoi usare VBScript, che ha un supporto RegEx decente.

MS ha anche una discreta area di scripting su Technet con molti esempi per gli amministratori.


0

Prova l'utilità java LikeGrep. Può aiutarti in moltissimi casi. Se lo desideri, può anche sostituire del testo, presente nei file. Garantisce il suo lavoro su file di grandi dimensioni (testato fino a 8 Gb)


0

Come accennato in precedenza, il progetto gnuwin32 ha una versione CLI di grep per Windows CLI.

Se vuoi qualcosa con un'interfaccia grafica, consiglierei lo strumento (open-source) AstroGrep .


0

È da un po 'che non li uso, ma Borland (ora Embarcadero) includeva un grep a linea di comando con il loro compilatore C / C ++. Per qualche tempo, hanno reso disponibile la loro versione 5.5 come download gratuito dopo la registrazione.



0

Raccomando PowerGrep

Ho dovuto fare un progetto di scoperta elettronica diversi anni fa. Ho scoperto che fisdstraveva alcune limitazioni, soprattutto il fisdstr alla fine avrebbe fallito

lo script doveva cercare tra migliaia di file usando un paio di dozzine di termini / frasi di ricerca.

Il grep di Cygwin ha funzionato molto meglio , non si è soffocato spesso, ma alla fine sono andato su PowerGrep perché l'interfaccia grafica ha reso molto più facile dire quando e dove si è schiantato, ed è stato anche molto semplice modificare in tutti i condizionali e produrre che Volevo. Alla fine PowerGrep era il più affidabile dei tre.


0

So che è un argomento un po 'vecchio ma, ecco un'altra cosa che puoi fare. Lavoro su una VM per sviluppatori senza accesso a Internet e spazio libero su disco piuttosto limitato, quindi ho fatto uso di Java installato su di esso.

Compilare un piccolo programma Java che stampa le corrispondenze regex sulla console. Metti il ​​vaso da qualche parte sul tuo sistema, crea un batch per eseguirlo e aggiungi la cartella alla tua variabile 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 (insieme a jgrep.jar):

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

e aggiungi c: \ jgrep alla fine della variabile d'ambiente PATH.

Ora chiama semplicemente jgrep "expression" file.txtda qualsiasi luogo.

Avevo bisogno di stampare alcuni gruppi specifici dalla mia espressione, quindi ho aggiunto un modificatore e lo chiamavo come jgrep -printGroup=1 "expression" file.txt.


0

Mi rendo conto che è una vecchia domanda, ma mi sono imbattuto in questo post in cerca di una risposta. E ne ho trovato uno così aggiungendolo qui per la memoria di Internet collettiva

Powershell: Modulo Select-String: Microsoft.PowerShell.Utility

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

e un post sul blog informativo con esempi avanzati: "Come" grep "in PowerShell" https://antjanus.com/blog/web-development-tutorials/how-to-grep-in-powershell/

Un semplice esempio da quel post sul blog: cat package.json | Select-String -Pattern webpack ls ./src/components/ | Select-String -Pattern View

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


0

Usa Cygwin ...

ha versioni a 32 e 64 bit
e funziona perfettamente da Windows 2000 (*)
a Windows 10 o Server 2019

Uso Cygwin da molto tempo ...
e recentemente ho provato a sostituire i sottosistemi Windows-Linux ...

non per molto ...
Sono tornato rapidamente a Cygwin di nuovo ...

molto più flessibile, controllabile e ricco ...
anche meno invadente ...

basta aggiungere \ bin al percorso ...
e puoi usarlo a prescindere in Windows / Batch / Powershell ...
o in una DOS-Box ... o in una Powershell-Box ...

Inoltre puoi installare un sacco di fantastici pacchetti
che funzionano davvero ... come nginX o PHP ... Uso persino il pacchetto Cygwin PHP nel mio IIS ...

Come bonus puoi anche usarlo da una shell bash ...
(Penso che questo fosse l'intento originale ;-))

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.