https://foro.gambas-es.org/viewtopic.php?f=22&t=8096
-----------------------------------
Shell
Miercoles, 10 Junio 2020, 13:00

Grep Mostrando Líneas Anteriores Y Posteriores A La Búsqueda
-----------------------------------
Buenas!.

A la hora de poder ver el resultado sobre las características del ratón, usé el comando grep buscando la palabra Mouse.
El problema es que eso solo me mostraba la línea que coincidía con la palabra Mouse.

Entonces me di cuenta de que grep tiene la opción. Before -B y After -A
Detrás de esta línea de argumentos le añades un número y te mostrará los resultado anteriores y posteriores incluyendo la búsqueda.
Por ejemplo:

Esto me mostraba solo el lugar de la coincidencia. 

[code linenumbers=false syntax=bash]
grep Mouse < dispositivos.txt
[/code]

Luego pude usar algo como esto:

[code linenumbers=false syntax=bash]
grep Mouse -B5 -A12 < dispositivos.txt
[/code]

Resultado fue:

[quote]
Disable-w-typing: n/a
Accel profiles:   n/a
Rotation:         n/a

Device:           Logitech USB-PS/2 Optical Mouse
Kernel:           /dev/input/event4
Group:            5
Seat:             seat0, default
Capabilities:     pointer 
Tap-to-click:     n/a
Tap-and-drag:     n/a
Tap drag lock:    n/a
Left-handed:      disabled
Nat.scrolling:    disabled
Middle emulation: disabled
Calibration:      n/a
Scroll methods:   button
[/quote]

Así podía encontrar el lugar desde comenzaba la descripción y donde acababa.
Lo curioso es que había una línea en blanco entre el resumen de los dispositivos.
Pero no tenía ni idea de como decir eso en una línea de comandos.

Al final opte por un bucle, que me costó entender la condicional.
La primera usa dos corchetes y la siguiente solo una.
Si no se usaba dos corchetes en la primera parece que buscaba encontrar un comando llamado como el contenido de la expresión.

[code linenumbers=false syntax=bash]
#!/bin/bash

# Comprobar si existe el comando en el sistema
# Vamos a comprobar y a usar el comando libinput para mostrar información del ratón

if [ -a "/usr/bin/libinput" ]; then
	echo "El comando libinput existe en su sistema."
	echo "El comando necesita permiso de super usuario para ejecución"	
	while IFS= read -r line
	do 
	    # Se comprueba si la línea de texto leída contiene la palabra Mouse
	    if [[ "$line" == *"Mouse"* ]]; then
	        echo "$line"
	        while IFS= read -r line2        
	        do
	            # Se comprueba que la línea de texto leída no es nula y tiene una longitud superior a cero
	            if [ -n "$line2" ]; then
	                echo "$line2"
	            else
	            	# Esto parece que rompe los dos bucles
	                break
	            fi
	        done
	    fi
	done < <(sudo libinput list-devices)
else
	echo "El comando libinput no existe en su sistema."
	echo "Ejecute primero: sudo apt-get install libinput"
[/code]

Entonces el primer bucle busca la palabra Mouse y luego otro bucle para llegar hasta donde se encuentra la línea en blanco.
Pero no tenía ni idea si el primer break rompería desde el bucle interno hasta el externo. Lo normal hubiese sido el interno.  :? 

No encontré una forma más sencilla.  A lo mejor usando awk o sed. Complicando con signos y símbolos.
Podía haber usado un script hecho en Gambas, pero no es un lenguaje que venga por defecto en el sistema.

Saludos


