¿Líneas de vista previa en vivo filtradas con una pila de filtros?

¿Líneas de vista previa en vivo filtradas con una pila de filtros?

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\|filter3pero 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 | headson solo unas pocas líneas y | lessdonde 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 :)

ejecutándose en /proc/cpuinfo

Lo anterior es el resultado de ejecutar python3 live-line-filter.py /proc/cpuinfocon 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 -fel 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.)

información relacionada