Linhas de visualização ao vivo filtradas com uma pilha de filtros?

Linhas de visualização ao vivo filtradas com uma pilha de filtros?

Eu gostaria de ter umvisualização ao vivode linhas de texto simples filtradas. É importante que vários filtros sejam aplicados de forma exclusiva ou inclusiva (semelhante aos filtros emmonitor de processo). Depois que a filtragem estiver pronta, gostaria de poder exportar o resultado.

Eu poderia conseguir algo semelhante, grep "filter1\|filter2\|filter3mas alguns dos meus greps apresentam erros e é difícil manter esse tipo de filtros, pois existem muitos filtros. A visualização ao vivo também não é facilmente alcançada, pois | headsão apenas algumas linhas e | lessonde posso fazer a pesquisa de texto, não tenho certeza se posso salvar o resultado. (Também é um pouco inconveniente com o pipeline, mesmo que eu goste da linha de comando.)

Para uma experiência de usuário diferente, eu poderia usar algo mais visual (embora prefira o mínimo).

Responder1

Olha o que fiz para você, naxa fofinha :)

rodando em /proc/cpuinfo

O texto acima é o resultado da execução python3 live-line-filter.py /proc/cpuinfodos filtros que você vê na imagem acima.

Ler do stdin seria bom, mas é difícil porque o Qt parece não suportá-lo. Eu acho que você poderia fazer isso em Python simples, executar o aplicativo Qt em outro thread e fazer com que o Qt escutasse em um soquete (e alimentá-lo a partir do thread principal do Python)... Muito trabalho para uma pequena melhoria. Acho que você já tem seus dados se quiser experimentar filtros ativos.

No Ubuntu, você pode instalar python3-pyqt4 para obter o PyQt (que é necessário).

filtro de linha ao vivo.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)

Alternativas:

Responder2

As solicitações de software estão fora do assunto aqui. No entanto, como solução alternativa, você pode usar -fo sinalizador do 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.)

informação relacionada