Live-preview lignes filtrées avec une pile de filtres?

2

J'aimerais avoir un aperçu en direct d'une ligne de texte filtré. Il est important d'appliquer plusieurs filtres de manière exclusive ou inclusive (similaires aux filtres dans le moniteur de processus ). Une fois que le filtrage est prêt, j'aimerais pouvoir exporter le résultat.

Je pourrais réaliser pareil avec grep "filter1\|filter2\|filter3mais certains de mes greps sont bogués et il est difficile de maintenir ce type de filtres car il y a beaucoup de filtres. L’aperçu en direct n’est pas facile à obtenir non plus, car il n’ya | headque quelques lignes et | lessoù je peux faire de la recherche de texte, je ne suis pas sûr de pouvoir sauvegarder le résultat. (C'est également un peu gênant avec le pipeline, même si j'aime la ligne de commande.)

Pour une expérience utilisateur différente, je pourrais utiliser quelque chose de plus visuel (bien que je préfère un minimum).

n611x007
la source

Réponses:

2

Regarde ce que j'ai fait pour toi, mignon petit Naxa :)

en cours d'exécution sur / proc / cpuinfo

Ce qui précède est le résultat de l'exécution python3 live-line-filter.py /proc/cpuinfoavec les filtres que vous voyez dans la capture d'écran ci-dessus.

Lire sur stdin serait bien, mais c'est difficile parce que Qt ne semble pas le supporter. Je suppose que vous pouvez le faire en Python simple, exécuter l'application Qt dans un autre thread et laisser Qt écouter sur un socket (et le nourrir à partir du thread principal Python) ... Trop de travail pour une toute petite amélioration. Je suppose que vous avez déjà vos données si vous voulez essayer les filtres en direct.

Sur Ubuntu, vous pouvez installer python3-pyqt4 pour obtenir PyQt (ce qui est nécessaire).

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)

Alternatives:

Janus Troelsen
la source
Ouah merci! Est-ce qu'on se connaît? ; P
n611x007
@naxa: non, j'essayais juste de vous faire paniquer: P. Dites-moi si le programme fonctionne pour vous.
Janus Troelsen
1

Les demandes de logiciels sont hors sujet ici. Cependant, comme solution de contournement, vous pouvez utiliser le -fdrapeau 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.)
terdon
la source
Je ne savais pas que c'était hors sujet. il y a une étiquette software-rec. => ??? btw merci de noter!
n611x007
@naxa Oui, il y a un tag, mais tout le monde peut créer des tags, voyez ici , cela relève de la "recommandation de produit".
Terdon
@terdon: Non, pas n'importe qui. Vous avez besoin de 300 rep .
Janus Troelsen
1
@naxa est sur le sujet pour des questions sur un problème particulier (lire: n'importe quoi sauf "Quel programme peut faire ça?"). A partir du logiciel rec tag: Important: It's often better to ask for a real problem instead of a software to solve it. Donc, dans ce cas, il aurait été préférable de simplement demander comment il est possible de combiner des expressions régulières ou comment utiliser l'outil grep pour empiler des filtres (l'idéologie générale de cela relève toujours de la philosophie générale d'UNIX).
Percée le
Je vois, merci beaucoup! Je recherche ici une expérience utilisateur, pas une simple "fonctionnalité", car cela apporterait une valeur significative pour moi. (Penser fort: cela devrait être valable, sinon je n’aurais besoin catque de gcc, et même pas de grep). Dans ce cas, je ferais mieux de le dire pour l'expérience utilisateur.
n611x007