
我想要一個即時預覽已過濾的純文字行。重要的是,需要獨佔或包含地應用多個過濾器(類似於過程監控器)。過濾準備就緒後,我希望能夠匯出結果。
我可以實現類似的功能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.)