
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\|filter3
mas 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 | head
são apenas algumas linhas e | less
onde 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 :)
O texto acima é o resultado da execução python3 live-line-filter.py /proc/cpuinfo
dos 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 -f
o 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.)