yum
e dnf
gravam mensagens de progresso, superando uma linha usando retornos de carro. Essas mensagens não estão envolvidas . grep
não foi criado para isso, supondo que as linhas não possuam caracteres de controle incorporados. grep
faz algumas suposições sobre terminais, mas isso é uma história diferente .
Eu uso um script sed para filtrar as linhas de sobrecorrente para uma linha "final" (excluindo toda a parte do overstruck). No exemplo script2log.sed
,
# $Id: script2log.sed,v 1.3 2015/02/04 23:50:12 tom Exp $
#
# Trim ordinary ANSI sequences, then OSC sequences, then backspace
# sequences, then trailing CR's and finally overstruck sections of
# lines.
#
# There are still several interesting cases which cannot be handled
# with a script of this sort. For example:
# CSI K (clear line)
# cursor movement within the line
s/␛[[][<=>?]\{0,1\}[;0-9]*[@-~]//g
s/␛[]][^␛]*␇//g
s/␛[]][^␛]*␛\//g
:loop
s/[^␈]␈\(.\)//g
t loop
s/␍␍*$//g
s/^.*␍//g
s/␛[^[]//g
Isso é feito com esses dois comandos, que primeiro remove qualquer número de retornos de carro à direita em uma linha e, em seguida, remove qualquer seção da linha incluindo um retorno de carro. O que resta é apenas a última cópia da linha a ser escrita (aquela que você quer):
s/␍␍*$//g
s/^.*␍//g
(e sim, esses são caracteres de retorno de carro literais no script).
Quando eu capturar a saída de yum
(ou dnf
), eu não tento canalizar para grep
(que é garantido para produzir resultados ruins). Em vez disso, eu uso script
para capturar a saída e pós-processamento que usa sed
, por exemplo,
script -c "yum upgrade"
sed -f script2log.sed typescript >upgrade.log