Линии предварительного просмотра в реальном времени, отфильтрованные с помощью набора фильтров?

Линии предварительного просмотра в реальном времени, отфильтрованные с помощью набора фильтров?

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

Я мог бы добиться подобного с помощью, 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 (который необходим).

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

Связанный контент