
Я хотел бы иметьпредварительный просмотр в реальном времениотфильтрованных строк простого текста. Важно, чтобы несколько фильтров применялись либо исключительно, либо инклюзивно (аналогично фильтрам вмонитор процесса). После завершения фильтрации я хотел бы иметь возможность экспортировать результат.
Я мог бы добиться подобного с помощью, 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 (который необходим).
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)
Альтернативы:
решение2
-f
Запросы программного обеспечения здесь не по теме. Однако, как обходной путь, вы можете использовать флаг grep :
-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.)