Ricerca di pattern con Grep in Java

1. Panoramica

In questo tutorial impareremo come cercare un pattern in un dato file, utilizzando Java e librerie di terze parti come Unix4J e Grep4J.

2. Sfondo

Unix ha un potente comando chiamato grep - che sta per " global regular expression print ". Cerca il modello o un'espressione regolare all'interno di un dato insieme di file.

Si possono usare zero o più opzioni insieme al comando grep per arricchire il risultato della ricerca che esamineremo in dettaglio nella prossima sezione.

Se stai usando Windows, puoi installare bash come menzionato nel post qui.

3. Con la libreria unix4j

Per prima cosa, vediamo come usare la libreria Unix4J per grep un pattern in un file.

Nel seguente esempio, vedremo come tradurre i comandi grep di Unix in Java.

3.1. Configurazione build

Aggiungi la seguente dipendenza dal tuo pom.xml o build.gradle :

 org.unix4j unix4j-command 0.4 

3.2. Esempio con Grep

Esempio di grep in Unix:

grep "NINETEEN" dictionary.txt 

L'equivalente in Java è:

@Test public void whenGrepWithSimpleString_thenCorrect() { int expectedLineCount = 4; File file = new File("dictionary.txt"); List lines = Unix4j.grep("NINETEEN", file).toLineList(); assertEquals(expectedLineCount, lines.size()); } 

Un altro esempio è dove possiamo usare la ricerca di testo inversa in un file. Ecco la versione Unix dello stesso:

grep -v "NINETEEN" dictionary.txt 

Ecco la versione Java del comando precedente:

@Test public void whenInverseGrepWithSimpleString_thenCorrect() { int expectedLineCount = 178687; File file = new File("dictionary.txt"); List lines = Unix4j.grep(Grep.Options.v, "NINETEEN", file). toLineList(); assertEquals(expectedLineCount, lines.size()); } 

Vediamo come possiamo usare l'espressione regolare per cercare un pattern in un file. Ecco la versione Unix per contare tutti i pattern di espressioni regolari trovati nell'intero file:

grep -c ".*?NINE.*?" dictionary.txt 

Ecco la versione Java del comando precedente:

@Test public void whenGrepWithRegex_thenCorrect() { int expectedLineCount = 151; File file = new File("dictionary.txt"); String patternCount = Unix4j.grep(Grep.Options.c, ".*?NINE.*?", file). cut(CutOption.fields, ":", 1).toStringResult(); assertEquals(expectedLineCount, patternCount); }

4. Con Grep4J

Successivamente, vediamo come utilizzare la libreria Grep4J per eseguire il grep di un pattern in un file che risiede localmente o da qualche parte in una posizione remota.

Nel seguente esempio, vedremo come tradurre i comandi grep di Unix in Java.

4.1. Configurazione build

Aggiungi la seguente dipendenza dal tuo pom.xml o build.gradle :

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Esempi Grep

Esempio di grep in Java, ovvero equivalente a:

grep "NINETEEN" dictionary.txt 

Ecco la versione Java del comando:

@Test public void givenLocalFile_whenGrepWithSimpleString_thenCorrect() { int expectedLineCount = 4; Profile localProfile = ProfileBuilder.newBuilder(). name("dictionary.txt").filePath("."). onLocalhost().build(); GrepResults results = Grep4j.grep(Grep4j.constantExpression("NINETEEN"), localProfile); assertEquals(expectedLineCount, results.totalLines()); } 

Un altro esempio è dove possiamo usare la ricerca di testo inversa in un file. Ecco la versione Unix dello stesso:

grep -v "NINETEEN" dictionary.txt 

Ed ecco la versione Java:

@Test public void givenRemoteFile_whenInverseGrepWithSimpleString_thenCorrect() { int expectedLineCount = 178687; Profile remoteProfile = ProfileBuilder.newBuilder(). name("dictionary.txt").filePath("."). filePath("/tmp/dictionary.txt"). onRemotehost("172.168.192.1"). credentials("user", "pass").build(); GrepResults results = Grep4j.grep( Grep4j.constantExpression("NINETEEN"), remoteProfile, Option.invertMatch()); assertEquals(expectedLineCount, results.totalLines()); } 

Vediamo come possiamo usare l'espressione regolare per cercare un pattern in un file. Ecco la versione Unix per contare tutti i pattern di espressioni regolari trovati nell'intero file:

grep -c ".*?NINE.*?" dictionary.txt 

Ecco la versione Java:

@Test public void givenLocalFile_whenGrepWithRegex_thenCorrect() { int expectedLineCount = 151; Profile localProfile = ProfileBuilder.newBuilder(). name("dictionary.txt").filePath("."). onLocalhost().build(); GrepResults results = Grep4j.grep( Grep4j.regularExpression(".*?NINE.*?"), localProfile, Option.countMatches()); assertEquals(expectedLineCount, results.totalLines()); }

5. conclusione

In questo breve tutorial, abbiamo illustrato la ricerca di un pattern in un dato file utilizzando Grep4j e Unix4J .

L'implementazione di questi esempi può essere trovata nel progetto GitHub: questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.

Infine, puoi naturalmente eseguire alcune delle basi della funzionalità simile a grep usando anche la funzionalità regex nel JDK.