
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\|filter3
aber 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 | head
sie nur wenige Zeilen umfasst und | less
ich 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 :)
Das Obige ist das Ergebnis der Ausführung python3 live-line-filter.py /proc/cpuinfo
mit 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 -f
das 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.)