Búsqueda por fragmentos de texto en Java usando grep

java-code-01-01-2018

El siguiente código es una muestra como use el comando grep a un problema que tuve, el comando hace una búsqueda de lineas de texto o patrones dentro de uno o varios archivos, el problema consistía en  como capturar en forma de un listado los nombre de los programas que se encentran en el directorio /usr/share/applications, las instruccion que debia de usar con el comando era la siguiente grep -Hirn Name= /usr/share/applications mostrar un linea con el texto en especifico y con Java solo imprimir todos los nombres de los programas que se encuentran en ese directorio.

Clases que se usaron:

Primer método

	public static void comando() throws IOException {

		String comando=null;

		//Comando a ejecutar - Busca las lineas donde aparece Name=
		Process p = Runtime.getRuntime().exec("grep -Hirn Name= /usr/share/applications");
		BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
		File archivo = new File("list_prog.txt");
		BufferedWriter bw = new BufferedWriter(new FileWriter(archivo));
		PrintWriter pw = new PrintWriter(bw);

		System.out.println("\nComando de salida: \n");
		while ((comando = br.readLine()) != null) {  

			System.out.println(comando);

			char[] busquedaChar=comando.toCharArray();
			for(int i=0; i<busquedaChar.length; i++){

				if( busquedaChar[i] == '=')
				{  i++;
					for(int j=i; j<busquedaChar.length; j++)
					{
						pw.append(busquedaChar[j]);
					}
					pw.append("\n");
				}
			}

		}

		pw.close();

	}

Explicaré de que trata el método anterior, es la ejecución del programa grep gracias al uso de la clase Process, luego pasamos la salida del proceso a una forma en la que se pueda leer en la consola pasando el objeto p por InputStream a un BufferedReader para poder leer la salida más comodamente, también se hizo uso de la clase File para crear un archivo de texto donde se almacenará la salida del comando, ya solo usaremos un ciclo while para que imprima la salida del proceso y seguido se creara un Array del tipo Char para buscar en cada linea de salida el carácter “=” que será almacenado en el archivo de texto todos los caracteres que estén después del “=” usando el ciclo for hasta que de el salto de línea y comience nuevamente a buscar en la siguiente linea de salida del comando grep.

Segundo metodo

	public static void imprimir() throws IOException {
		//Se imprimira la lista de programas
		String Cadena=null;
		FileReader fr = new FileReader("list_prog.txt");
		BufferedReader bf = new BufferedReader(fr);

		System.out.println("\n\nLista de programas:\n");
		while((Cadena=bf.readLine())!=null)
		{
			System.out.println(Cadena);
		}

		bf.close();

	}

El método anterior imprimir() utiliza la clase FileReader para poder leer el archivo donde se almacenan los nombre de los programas que se ingresaron en el anterior método.

La clase Main:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class Main {

	public static void main(String[] args) throws IOException   {

		comando();
		imprimir();
	}

	public static void comando() throws IOException {
		//...
	}

	public static void imprimir() throws IOException {
		//...
	}

}

La salida del programa:

Comando de salida: 

/usr/share/applications/org.gnome.Cheese.desktop:2:Name=Cheese
/usr/share/applications/org.gnome.Cheese.desktop:89:GenericName=Webcam Booth
/usr/share/applications/org.gnome.Cheese.desktop:142:X-GNOME-FullName=Cheese Webcam Booth
/usr/share/applications/ibus-setup-typing-booster.desktop:2:Name=Typing Booster Preferences
/usr/share/applications/gnome-printers-panel.desktop:3:Name=Prin­ters
/usr/share/applications/uget-gtk.desktop:2:Name=uGet
/usr/share/applications/uget-gtk.desktop:3:GenericName=Download Manager
/usr/share/applications/evince.desktop:2:Name=Document Viewer


Lista de programas:

Cheese
Webcam Booth
Cheese Webcam Booth
Typing Booster Preferences
Prin­ters
uGet
Download Manager
Document Viewer

Puede ser que se encuentre una forma mas sencilla de llegar a ese resultado, pero esa fue la que se me ocurrio.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s