
me gustaria tener unvista previa en vivode unas líneas de texto plano filtradas. Es importante que se apliquen múltiples filtros, ya sea de forma exclusiva o inclusiva (similar a los filtros enmonitor de proceso). Una vez que el filtrado esté listo, me gustaría poder exportar el resultado.
Podría lograr algo similar, grep "filter1\|filter2\|filter3
pero algunos de mis greps tienen errores y es difícil mantener este tipo de filtros, hay muchos filtros. La vista previa en vivo tampoco se logra fácilmente, porque | head
son solo unas pocas líneas y | less
donde puedo hacer búsquedas de texto, no estoy seguro de poder guardar el resultado. (También es un poco inconveniente con la canalización, incluso si me gusta la línea de comando).
Para una experiencia de usuario diferente, podría usar algo más visual (aunque prefiero lo mínimo).
Respuesta1
Mira lo que hice para ti, linda naxa :)
Lo anterior es el resultado de ejecutar python3 live-line-filter.py /proc/cpuinfo
con los filtros que ve en la captura de pantalla anterior.
Leer desde stdin sería bueno, pero es difícil porque Qt no parece admitirlo. Supongo que podrías hacerlo en Python simple, ejecutar la aplicación Qt en otro hilo y hacer que Qt escuche en un socket (y alimentarlo desde el hilo principal de Python)... Demasiado trabajo para una pequeña mejora. Supongo que ya tienes tus datos si quieres probar los filtros en vivo.
En Ubuntu, puedes instalar python3-pyqt4 para obtener PyQt (que es necesario).
filtro-linea-vivo.py:
from PyQt4 import Qt
import sys
import fileinput
import re
class LiveLineFilterApplication(Qt.QApplication):
def __init__(self, args):
Qt.QApplication.__init__(self, args)
self.addWidgets()
self.unfilteredlines = [x for x in fileinput.input()]
self.slotRefilter()
self.exec_()
def addWidgets(self):
self.w = Qt.QWidget()
self.layout = Qt.QVBoxLayout(self.w)
self.input = Qt.QTextEdit(".*", None)
self.input.textChanged.connect(self.slotRefilter)
self.textedit = Qt.QTextEdit("pending", None)
self.textedit.setReadOnly(True)
self.layout.addWidget(self.input)
self.layout.addWidget(self.textedit)
self.w.show()
def slotRefilter(self):
filters = self.input.toPlainText().strip()
matches = self.unfilteredlines
for filt in filters.split("\n"):
if filt == "": continue
r = re.compile(filt)
matches = [x for x in matches if r.search(x)]
self.textedit.setText("".join(matches))
if __name__ == "__main__":
app = LiveLineFilterApplication(sys.argv)
Alternativas:
Respuesta2
Las solicitudes de software están fuera de tema aquí. Sin embargo, como solución alternativa, puedes usar -f
el indicador de grep:
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The
empty file contains zero patterns, and
therefore matches nothing. (-f is specified
by POSIX.)