Mit einem Filterstapel gefilterte Live-Vorschau-Zeilen?

Mit einem Filterstapel gefilterte Live-Vorschau-Zeilen?

Ich hätte gerne eineLive Vorschaueiner gefilterten Klartextzeile. Dabei ist zu beachten, dass mehrere Filter entweder exklusiv oder inklusiv angewendet werden müssen (ähnlich den Filtern inProzessmonitor). Nachdem die Filterung abgeschlossen ist, möchte ich das Ergebnis exportieren können.

Ich könnte etwas Ähnliches erreichen, grep "filter1\|filter2\|filter3aber einige meiner Greps sind fehlerhaft und es ist schwierig, diese Art von Filtern zu warten, da es viele Filter gibt. Eine Live-Vorschau ist auch nicht einfach zu erreichen, da | headsie nur wenige Zeilen umfasst und | lessich nicht sicher bin, ob ich das Ergebnis speichern kann, wenn ich dort eine Textsuche durchführen kann. (Außerdem ist es mit der Pipeline etwas umständlich, auch wenn ich die Befehlszeile mag.)

Für ein anderes Benutzererlebnis könnte ich etwas Visuelleres gebrauchen (obwohl ich Minimales bevorzuge).

Antwort1

Schau, was ich für dich gemacht habe, süße kleine Naxa :)

läuft auf /proc/cpuinfo

Das Obige ist das Ergebnis der Ausführung python3 live-line-filter.py /proc/cpuinfomit den Filtern, die Sie im Screenshot oben sehen.

Das Lesen von stdin wäre nett, aber es ist schwierig, weil Qt es nicht zu unterstützen scheint. Ich schätze, Sie könnten es in einfachem Python tun, die Qt-App in einem anderen Thread ausführen und Qt auf einem Socket lauschen lassen (und es vom Python-Hauptthread aus versorgen)... Zu viel Arbeit für eine winzige Verbesserung. Ich schätze, Sie haben Ihre Daten bereits, wenn Sie Live-Filter ausprobieren möchten.

Unter Ubuntu können Sie python3-pyqt4 installieren, um PyQt zu erhalten (was benötigt wird).

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)

Alternativen:

Antwort2

Softwareanfragen sind hier kein Thema. Als Workaround können Sie jedoch -fdas Flag von grep verwenden:

   -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.)

verwandte Informationen