使用一堆過濾器過濾即時預覽行?

使用一堆過濾器過濾即時預覽行?

我想要一個即時預覽已過濾的純文字行。重要的是,需要獨佔或包含地應用多個過濾器(類似於過程監控器)。過濾準備就緒後,我希望能夠匯出結果。

我可以實現類似的功能grep "filter1\|filter2\|filter3,但我的一些 grep 有問題,而且很難維護這種過濾器,因為有很多過濾器。即時預覽也不容易實現,因為| head只有幾行,而且| less我可以在其中進行文字搜索,我不確定是否可以保存結果。 (即使我喜歡命令列,管道也有點不方便。)

對於不同的使用者體驗,我可以使用更直觀的東西(儘管更喜歡最小的)。

答案1

看看我為你做了什麼,可愛的小納克薩:)

運行在 /proc/cpuinfo 上

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

相關內容