pt Remover linhas que terminam em [0-9]%

0

Estou escrevendo um script que registra stdout-stderr.

O log contém várias instâncias de:

(Reading database ... 
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 52099 files and directories currently installed.)

Como posso remover as linhas que terminam em [0-9]% ? Assim, as linhas se tornam:

(Reading database ... 
(Reading database ... 52099 files and directories currently installed.)

Eu tentei várias formas de:

sed -i '/[0-9%]$/d' ~/test/Log

... incluindo escapando% - mas sem sorte. Não consegui encontrar nenhum dos exemplos que encontrei para trabalhar.

Eu estou especificamente querendo usar sed , alguma idéia?

A linha sed -i '/[0-9%]$/d' ~/test/Log parece funcionar em um arquivo de teste, mas não no log real por algum motivo.

Eu tentei /%$/d (provavelmente funciona em um arquivo de teste) - não funcionou no log ..

Eu tentei /[0-9]%$/d - mas nenhum efeito no arquivo de log ...

sed versão:

~ sed --version
sed (GNU sed) 4.2.2

Caminho para registrar ~/test/Log

'/[0-9]%[[:blank:]]*$/d' não parece alterar o log.

Com relação à saída - não há erro. Cat'ing o arquivo mostra a saída correta (linhas removidas) ...

Nota:

Estou descobrindo quando eu cat o arquivo em que as linhas se foram - quando abro o arquivo no meu editor (Sublime Text 3) - as linhas ainda são exibidas.

Eu tentei reinicializar caso houvesse um arquivo de swap em algum lugar, mas ainda estou obtendo os mesmos resultados.

    
por Pear 25.09.2015 / 00:41

4 respostas

1

Acontece que o arquivo tinha caracteres de controle - especificamente: ^ M

cat não exibiu o ^ M - mas less fez ..

A saída less é semelhante a:

Get:3 http://us.archive.ubuntu.com/ubuntu/ vivid-updates/main policykit-1 amd64 0.105-8ubuntu3 [51.6 kB]
Fetched 102 kB in 0s (144 kB/s)
Selecting previously unselected package libpolkit-agent-1-0:amd64.
(Reading database ... ^M(Reading database ... 5%^M(Reading database ... 10%^M(Reading database ... 15%^M(Reading database ... 20%^M(Reading database ... 25%^M(Reading database ... 30%^M(Reading database ... 35%^M(Reading database ... 40%^M(Reading database ... 45%^M(Reading database ... 50%^M(Reading database ... 55%^M(Reading database ... 60%^M(Reading database ... 65%^M(Reading database ... 70%^M(Reading database ... 75%^M(Reading database ... 80%^M(Reading database ... 85%^M(Reading database ... 90%^M(Reading database ... 95%^M(Reading database ... 100%^M(Reading database ... 52099 files and directories currently installed.)
Preparing to unpack .../libpolkit-agent-1-0_0.105-8ubuntu3_amd64.deb ...
Unpacking libpolkit-agent-1-0:amd64 (0.105-8ubuntu3) ...

Observe que a linha "(banco de dados de leitura" é uma cadeia longa (com ^ M).

Remover a linha com sed remove toda a linha, agora é óbvio o motivo.

sed string replace reconhece partes da string, então pode ser usado para quebrar a linha.

Isso é o que acabou funcionando (^ M está na string):

sed -i 's/(Reading database \.\.\. [0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. [0-9][0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. [0-9][0-9][0-9]%\r//g' ~/Desktop/Log
sed -i 's/(Reading database \.\.\. \r//g' ~/Desktop/Log
sed -i '/^\s*$/d' ~/Desktop/Log

Que substitui a parte especificada da linha por "nothing", a última linha remove as linhas com "nothing" ... então o resultado é:

Get:3 http://us.archive.ubuntu.com/ubuntu/ vivid-updates/main policykit-1 amd64 0.105-8ubuntu3 [51.6 kB]
Fetched 102 kB in 0s (144 kB/s)
Selecting previously unselected package libpolkit-agent-1-0:amd64.
(Reading database ... 52099 files and directories currently installed.)
Preparing to unpack .../libpolkit-agent-1-0_0.105-8ubuntu3_amd64.deb ...
Unpacking libpolkit-agent-1-0:amd64 (0.105-8ubuntu3) ...

Tenho certeza de que há uma maneira mais fácil, mas nenhuma das minhas experiências funcionou, incluindo o agrupamento ( {[0-9],[0-9][0-9],[0-9][0-9][0-9]} ), etc ...

Depois de horas de mexer com isso, estou disposto a aceitar minha resposta prolixa ...:)

Atualizar

O usuário don_crissti tem uma solução mais eficiente que alcança o mesmo resultado:

sed 's/.*(Reading/(Reading/'

(... esperando para aceitar se ele postar)

    
por 25.09.2015 / 18:42
3

Você não deve ter o % entre os colchetes. A implementação correta é:
sed -i '/[0-9]%$/d' ~/test/Log

    
por 25.09.2015 / 01:03
0

Este é um trabalho para grep :

grep -vE '[0-9]%$'

o v significa em v ert, e E é E xtended regexp.

    
por 25.09.2015 / 01:15
0

Seu arquivo de log provavelmente tem espaços ou tabulações ou outros caracteres não imprimíveis no final, após o '%'. Experimente:

 grep "Reading Database" ~/Test/Log | cat -A

(NOTA: cat -A requer o GNU cat, que eu suponho que você tenha porque você tem o GNU sed)

Se houver alguma coisa entre % e $ nessas linhas, isso confirma isso. Nesse caso, altere seu script sed para:

sed -i '/Reading Database.*[0-9]+%/d'
    
por 25.09.2015 / 03:12