Linee di anteprima dal vivo filtrate con una pila di filtri?


2

Vorrei avere un'anteprima dal vivo di una riga di testo semplice filtrata. È importante applicare più filtri in modo esclusivo o inclusivo (simile ai filtri nel monitor di processo ). Dopo che il filtro è pronto, vorrei essere in grado di esportare il risultato.

Potrei ottenere risultati simili con, grep "filter1\|filter2\|filter3ma alcune delle mie greps sono buggy ed è difficile mantenere questo tipo di filtri, ci sono molti filtri. Anche l'anteprima dal vivo non è facilmente realizzabile, poiché | headsono solo poche righe e con | lessdove posso fare la ricerca di testo, non sono sicuro di poter salvare il risultato. (Inoltre è un po 'scomodo con la pipeline, anche se mi piace la riga di comando.)

Per un'esperienza utente diversa, potrei usare qualcosa di più visivo (sebbene preferisca il minimo).

Risposte:


2

Guarda cosa ho fatto per te, piccola naxa :)

in esecuzione su / proc / cpuinfo

Quanto sopra è il risultato dell'esecuzione python3 live-line-filter.py /proc/cpuinfocon i filtri che vedi nello screenshot sopra.

Leggere da stdin sarebbe carino, ma è difficile perché Qt non sembra supportarlo. Immagino che potresti farlo in puro Python, eseguire l'app Qt in un altro thread e far ascoltare Qt su un socket (e alimentarlo dal thread principale di Python) ... Troppo lavoro per un piccolo miglioramento. Immagino che tu abbia già i tuoi dati se vuoi provare i filtri live.

Su Ubuntu, puoi installare python3-pyqt4 per ottenere PyQt (che è necessario).

live-line-filter.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)

alternative:


Wow grazie! ci conosciamo? ; P
n611x007

@naxa: no, stavo solo cercando di spaventarti: P. Dimmi se il programma funziona per te.
Janus Troelsen,

1

Le richieste di software sono fuori tema qui. Tuttavia, come soluzione alternativa, è possibile utilizzare il -fflag di 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.)

non sapevo che fosse fuori tema. c'è un tag software-rec. => ??? a proposito grazie per aver notato!
n611x007

@naxa Sì, c'è un tag ma i tag possono essere creati da chiunque, vedi qui , questo rientra nella "raccomandazione del prodotto".
terdon,


1
@naxa è in argomento per domande su un problema particolare (leggi: tutto tranne "Quale programma può fare questo?"). Dal software-rec tag: Important: It's often better to ask for a real problem instead of a software to solve it. Quindi, in questo caso, sarebbe meglio semplicemente chiedere come sia possibile combinare espressioni regolari o informarsi su come lo strumento grep possa essere usato per impilare i filtri (l'ideologia generale di ciò rientra ancora nella filosofia generale UNIX).
Breakthrough

Vedo, grazie mille! Cerco un'esperienza utente qui, non semplice "funzionalità", poiché aggiungerebbe un valore significativo per me. (Pensando ad alta voce: questo dovrebbe essere valido, dal momento che altrimenti avrei solo bisogno cate gcc, nemmeno grep). Farò meglio a dire che migliora l'esperienza dell'utente.
n611x007,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.