我想要一个实时预览过滤纯文本行。重要的是,需要以排他或包容的方式应用多个过滤器(类似于进程监视器)。过滤完成后,我希望能够导出结果。
我可以用类似方法实现grep "filter1\|filter2\|filter3
,但我的一些 grep 有缺陷,而且很难维护这种过滤器,因为过滤器太多了。实时预览也不容易实现,因为| head
只有几行,而且| less
我可以在其中进行文本搜索,但我不确定是否可以保存结果。(此外,管道有点不方便,即使我喜欢命令行。)
为了获得不同的用户体验,我可以使用一些更直观的东西(尽管更喜欢极简主义)。
答案1
看看我为你做了什么,可爱的小纳克萨:)
以上是python3 live-line-filter.py /proc/cpuinfo
使用您在上面的屏幕截图中看到的过滤器运行的结果。
从 stdin 读取数据会很好,但这很难,因为 Qt 似乎不支持它。我想你可以用普通的 Python 来做,在另一个线程中运行 Qt 应用程序,并让 Qt 监听套接字(并从 Python 主线程中提供数据)... 为了一个小小的改进而付出了太多的努力。我想如果你想尝试实时过滤器,你已经有了数据。
在 Ubuntu 上,您可以安装 python3-pyqt4 来获取 PyQt(这是必需的)。
实时过滤器.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)
备择方案:
答案2
软件请求与此无关。但是,作为一种解决方法,您可以使用 grep 的-f
标志:
-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.)