Mustersuche mit Grep in Java

Mustersuche mit Grep in Java

1. Überblick

In diesem Tutorial erfahren Sie, wie Siesearch for a pattern in a given file/s verwenden - mithilfe von Java und Bibliotheken von Drittanbietern wieUnix4J undGrep4J.

2. Hintergrund

Unix hat einen mächtigen Befehl namensgrep - der für "global regular expression print" steht. Es sucht nach dem Muster oder einem regulären Ausdruck innerhalb eines bestimmten Satzes von Dateien.

Sie können null oder mehr Optionen zusammen mit dem Befehl grep verwenden, um das Suchergebnis zu erweitern, auf das wir im nächsten Abschnitt näher eingehen werden.

Wenn Sie Windows verwenden, können Sie bash wie inhere beschrieben installieren.

3. mit unix4j Library

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

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 Ihrenpom.xml oderbuild.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 weiteres Beispiel ist die Verwendung der inversen Textsuche in einer Datei. 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 reguläre Ausdrücke verwenden können, um nach einem Muster in einer Datei zu suchen. Hier ist die Unix-Version, um alle in der gesamten Datei gefundenen Muster für reguläre Ausdrücke 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 lokal oder an einem anderen Ort in einem anderen Verzeichnis suchen.

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 Ihrenpom.xml oderbuild.gradle hinzu:


    com.googlecode.grep4j
    grep4j
    1.8.7

4.2. Grep Beispiele

Beispiel grep in Java, d. H. Äquivalent von:

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 weiteres Beispiel ist die Verwendung der inversen Textsuche in einer Datei. 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 reguläre Ausdrücke verwenden können, um nach einem Muster in einer Datei zu suchen. Hier ist die Unix-Version, um alle in der gesamten Datei gefundenen Muster für reguläre Ausdrücke 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. Fazit

In diesem kurzen Tutorial haben wir die Suche nach einem Muster in einer bestimmten Datei (en) mitGrep4j undUnix4J veranschaulicht.

Die Implementierung dieser Beispiele finden Sie inthe GitHub project - 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 mitthe regex functionality im JDK ausführen.