Búsqueda de patrones con Grep en Java

1. Información general

En este tutorial, aprenderemos cómo buscar un patrón en un archivo o archivos determinados , utilizando Java y bibliotecas de terceros como Unix4J y Grep4J.

2. Fondo

Unix tiene un poderoso comando llamado grep , que significa " impresión de expresión regular global ". Busca el patrón o una expresión regular dentro de un conjunto de archivos determinado.

Uno puede usar cero o más opciones junto con el comando grep para enriquecer el resultado de la búsqueda, que veríamos en detalles en la próxima sección.

Si está usando Windows, puede instalar bash como se menciona en la publicación aquí.

3. Con la biblioteca unix4j

Primero, veamos cómo usar la biblioteca Unix4J para grep de un patrón en un archivo.

En el siguiente ejemplo, veremos cómo traducir los comandos grep de Unix en Java.

3.1. Configuración de compilación

Agregue la siguiente dependencia en su pom.xml o build.gradle :

 org.unix4j unix4j-command 0.4 

3.2. Ejemplo con Grep

Ejemplo de grep en Unix:

grep "NINETEEN" dictionary.txt 

El equivalente en Java es:

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

Otro ejemplo es donde podemos usar la búsqueda de texto inverso en un archivo. Aquí está la versión Unix del mismo:

grep -v "NINETEEN" dictionary.txt 

Aquí está la versión de Java del comando anterior:

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

Veamos cómo podemos usar expresiones regulares para buscar un patrón en un archivo. Aquí está la versión de Unix para contar todos los patrones de expresión regular encontrados en todo el archivo:

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

Aquí está la versión de Java del comando anterior:

@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

A continuación, veamos cómo usar la biblioteca Grep4J para grep de un patrón en un archivo que reside localmente o en algún lugar remoto.

En el siguiente ejemplo, veremos cómo traducir los comandos grep de Unix en Java.

4.1. Construir configuración

Agregue la siguiente dependencia en su pom.xml o build.gradle :

 com.googlecode.grep4j grep4j 1.8.7 

4.2. Ejemplos de Grep

Ejemplo de grep en Java, es decir, equivalente a:

grep "NINETEEN" dictionary.txt 

Aquí está la versión 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()); } 

Otro ejemplo es donde podemos usar la búsqueda de texto inverso en un archivo. Aquí está la versión Unix del mismo:

grep -v "NINETEEN" dictionary.txt 

Y aquí está la versión de 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()); } 

Veamos cómo podemos usar expresiones regulares para buscar un patrón en un archivo. Aquí está la versión de Unix para contar todos los patrones de expresión regular encontrados en todo el archivo:

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

Aquí está la versión de 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. Conclusión

En este tutorial rápido, ilustramos la búsqueda de un patrón en un archivo o archivos determinados usando Grep4j y Unix4J .

La implementación de estos ejemplos se puede encontrar en el proyecto GitHub; este es un proyecto basado en Maven, por lo que debería ser fácil de importar y ejecutar tal como está.

Finalmente, naturalmente puede hacer algunos de los conceptos básicos de la funcionalidad similar a grep utilizando la funcionalidad regex en el JDK también.