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

2

Eu gostaria de ter uma visualização ao vivo de linhas de texto simples filtradas. É importante que vários filtros precisem ser aplicados de forma exclusiva ou inclusiva (semelhante aos filtros do monitor de processo ). Após a filtragem estar pronta, gostaria de poder exportar o resultado.

Eu poderia alcançar algo semelhante com grep "filter1\|filter2\|filter3 , mas alguns dos meus greps têm bugs e é difícil manter esse tipo de filtro, pois há muitos filtros. A visualização ao vivo também não é fácil, pois | head é apenas algumas linhas e, com | less , onde posso pesquisar texto, não tenho certeza se posso salvar o resultado. (Também é um pouco inconveniente com pipeline, mesmo que eu goste de linha de comando).

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

    
por n611x007 09.06.2013 / 16:04

2 respostas

2

Olha o que eu fiz pra você, fofa fofinha:)

Oqueprecedeéoresultadodaexecuçãodepython3live-line-filter.py/proc/cpuinfocomosfiltrosquevocêvênacapturadetelaacima.

Lerdestdinserialegal,masédifícilporqueoQtparecenãosuportarisso.Euachoquevocêpoderiafazê-loemPythonsimples,executaroaplicativoQtemoutrothread,eterQtescutaemumsocket(ealimentá-loapartirdothreadprincipaldoPython)...Muitotrabalhoparaumapequenamelhoria.Euachoquevocêjátemseusdadossevocêquiserexperimentarosfiltrosaovivo.

NoUbuntu,vocêpodeinstalaropython3-pyqt4paraobteroPyQt(queénecessário).

live-line-filter.py:

fromPyQt4importQtimportsysimportfileinputimportreclassLiveLineFilterApplication(Qt.QApplication):def__init__(self,args):Qt.QApplication.__init__(self,args)self.addWidgets()self.unfilteredlines=[xforxinfileinput.input()]self.slotRefilter()self.exec_()defaddWidgets(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:

por 09.06.2013 / 17:52
1

As solicitações de software estão fora do tópico aqui. No entanto, como solução alternativa, você pode usar o sinalizador -f 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.)
    
por 09.06.2013 / 16:14

Tags