2

Я хотел бы иметь предварительный просмотр отфильтрованных строк простого текста. Важно, чтобы несколько фильтров применялись либо исключительно, либо включительно (аналогично фильтрам в мониторе процесса). После того, как фильтрация будет готова, я хотел бы иметь возможность экспортировать результат.

Я мог бы добиться аналогичных результатов с помощью grep "filter1\|filter2\|filter3 но некоторые из моих программ grep глючат, и трудно поддерживать такие фильтры, существует множество фильтров. Живой предварительный просмотр также не легко достигается, потому что | head всего в несколько строк и с | less где я могу сделать поиск текста, я не уверен, смогу ли я сохранить результат. (Также это немного неудобно с конвейером, даже если мне нравится командная строка.)

Для другого пользовательского опыта я мог бы использовать что-то более визуальное (хотя предпочитаю минимальное).

2 ответа2

2

Посмотри, что я сделал для тебя, милый маленький накс :)

работает на /proc /cpuinfo

Выше приведен результат запуска 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)

Альтернативы:

1

Запросы на программное обеспечение не по теме здесь. Однако, в качестве обходного пути, вы можете использовать флаг -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.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .