Mustersuche mit Grep in Java

1. Übersicht

In diesem Tutorial erfahren Sie, wie Sie in einer bestimmten Datei nach einem Muster suchen. Verwenden Sie dazu Java und Bibliotheken von Drittanbietern wie Unix4J und Grep4J.

2. Hintergrund

Unix verfügt über einen leistungsstarken Befehl namens grep, der für " Global Regular Expression Print " steht. Es sucht nach dem Muster oder einem regulären Ausdruck innerhalb eines bestimmten Satzes von Dateien.

Man kann null oder mehr Optionen zusammen mit dem Befehl grep verwenden, um das Suchergebnis anzureichern, auf das wir im nächsten Abschnitt näher eingehen würden.

Wenn Sie Windows verwenden, können Sie bash wie im Beitrag hier erwähnt installieren.

3. Mit unix4j Library

Lassen Sie uns zunächst sehen, wie Sie mit der Unix4J-Bibliothek ein Muster in einer Datei erfassen.

Im folgenden Beispiel sehen wir uns an, wie die Unix-grep-Befehle in Java übersetzt werden.

3.1. Konfiguration erstellen

Fügen Sie die folgende Abhängigkeit von Ihrer pom.xml oder build.gradle hinzu :

 org.unix4j unix4j-command 0.4 

3.2. Beispiel mit Grep

Beispiel grep in Unix:

grep "NINETEEN" dictionary.txt 

Das Äquivalent in Java ist:

@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()); } 

Ein anderes Beispiel ist, wo wir die inverse Textsuche in einer Datei verwenden können. Hier ist die Unix-Version desselben:

grep -v "NINETEEN" dictionary.txt 

Hier ist die Java-Version des obigen Befehls:

@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()); } 

Mal sehen, wie wir mit regulären Ausdrücken nach einem Muster in einer Datei suchen können. Hier ist die Unix-Version, um alle Muster regulärer Ausdrücke in der gesamten Datei zu zählen:

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

Hier ist die Java-Version des obigen Befehls:

@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. Mit Grep4J

Weiter - sehen wir uns an, wie Sie mit der Grep4J-Bibliothek ein Muster in einer Datei erfassen, die sich entweder lokal oder an einem entfernten Ort befindet.

Im folgenden Beispiel sehen wir uns an, wie die Unix-grep-Befehle in Java übersetzt werden.

4.1. Konfiguration erstellen

Fügen Sie die folgende Abhängigkeit von Ihrer pom.xml oder build.gradle hinzu :

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Grep Beispiele

Beispiel grep in Java, dh äquivalent zu:

grep "NINETEEN" dictionary.txt 

Hier ist die Java-Version des Befehls:

@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()); } 

Ein anderes Beispiel ist, wo wir die inverse Textsuche in einer Datei verwenden können. Hier ist die Unix-Version desselben:

grep -v "NINETEEN" dictionary.txt 

Und hier ist die Java-Version:

@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()); } 

Mal sehen, wie wir mit regulären Ausdrücken nach einem Muster in einer Datei suchen können. Hier ist die Unix-Version, um alle Muster regulärer Ausdrücke in der gesamten Datei zu zählen:

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

Hier ist die Java-Version:

@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. Schlussfolgerung

In diesem kurzen Tutorial haben wir die Suche nach einem Muster in einer bestimmten Datei (en) mit Grep4j und Unix4J veranschaulicht .

Die Implementierung dieser Beispiele finden Sie im GitHub-Projekt - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.

Schließlich können Sie natürlich auch einige der Grundlagen der grep-ähnlichen Funktionalität mithilfe der Regex-Funktionalität im JDK ausführen.