Mustersuche mit Grep in Java
1. Überblick
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.