Pular para o conteúdo

Enxugando o código em Shell [RESOLVIDO]

Responder tópico
  • Denunciar
  • Indicar

1. Enxugando o código em Shell [RESOLVIDO]

Enviado em 14/07/2020 - 15:40h

Eu tenho um script já pronto, mas quero melhorá-lo.

O problemas está nesse código, é muito longo:

apt list --installed | cut -d '[' -f 1 | sed -e 's|amd64 |amd64|g' -e 's|all |all|g' -e 's|i386 |i386|g' -e 's|/[^ ]*now |_|g' -e 's| |_|g' -e '1d' > $L1 


O código apt list --installed gera algo do tipo:

zlib1g/focal,now 1:1.2.11.dfsg-2ubuntu1 amd64 [installed] 


Ele lista os pacotes instalados, mas com uma parafernália junto.

O para remover o [installed] do final, usei isso:

cut -d '[' -f 1 


Mas sobra um espaço no final que eu tenho que resolver assim:

-e 's|amd64 |amd64|g' -e 's|all |all|g' -e 's|i386 |i386|g' 


Sem isso o resultado final é isso:

zlib1g_1:1.2.11.dfsg-2ubuntu1_amd64_ 


Eu queria uma solução que pudesse melhorar ou substituir o cut para enxugar o sed e melhorar a eficiência do código.

No caso, remover o [installed] do final junto com o espaço anterior a ele.



Responder tópico

2. Re: Enxugando o código em Shell [RESOLVIDO]

Melhor resposta

Enviado em 14/07/2020 - 18:25h

apt list --installed | sed 's/ \[installed\]//'

3. Re: Enxugando o código em Shell [RESOLVIDO]

Enviado em 14/07/2020 - 19:28h


apt list --installed | sed 's/ \[installed\]//'

Funcionou. Creio que essa contra barra serviu para o sed não zicar com os colchetes. Estou certo?

___________________________________
Conhecimento não se Leva para o Túmulo.

4. Re: Enxugando o código em Shell [RESOLVIDO]

Enviado em 14/07/2020 - 19:30h


mauricio123 escreveu:

Eu tenho um script já pronto, mas quero melhorá-lo.

O problemas está nesse código, é muito longo:

apt list --installed | cut -d '[' -f 1 | sed -e 's|amd64 |amd64|g' -e 's|all |all|g' -e 's|i386 |i386|g' -e 's|/[^ ]*now |_|g' -e 's| |_|g' -e '1d' > $L1 


O código apt list --installed gera algo do tipo:

zlib1g/focal,now 1:1.2.11.dfsg-2ubuntu1 amd64 [installed] 


Ele lista os pacotes instalados, mas com uma parafernália junto.

O para remover o [installed] do final, usei isso:

cut -d '[' -f 1 


Mas sobra um espaço no final que eu tenho que resolver assim:

-e 's|amd64 |amd64|g' -e 's|all |all|g' -e 's|i386 |i386|g' 


Sem isso o resultado final é isso:

zlib1g_1:1.2.11.dfsg-2ubuntu1_amd64_ 


Eu queria uma solução que pudesse melhorar ou substituir o cut para enxugar o sed e melhorar a eficiência do código.

No caso, remover o [installed] do final junto com o espaço anterior a ele.

Boa noite Mauricio,
Segue sugestão:
apt list --installed 2>/dev/null|awk -F '[/, ]' 'NR>1 {print "ESCOLHA OS CAMPOS*"}' 

Observe que o número de campos vária, caso tenha pacotes a ser atualizado, ou, dependendo do tipo da instalação:
[6] alsa-utils/stable,now 1.1.8-2 amd64 [installed]
[7] anacron/stable,now 2.3-28 amd64 [installed,automatic]
[9] apt-utils/stable,now 1.8.2 amd64 [installed,upgradable to: 1.8.2.1]
Outra opção, é "pegar" direto do arquivo, aqui se mostrou mais rápido:
awk 'BEGIN{RS="\n\n";FS="[\n:]";} {print NR,NF,$2}' /var/lib/dpkg/status
É isso, espero que as informações sejam úteis....


______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________

5. Re: Enxugando o código em Shell [RESOLVIDO]

Enviado em 14/07/2020 - 20:40h

Sim. Eu percebi e simplifiquei a expressão assim:

apt list --installed | sed -e 's| \[.*\]||g' 


Também fincionou. Vou testar seu exemplo.

___________________________________
Conhecimento não se Leva para o Túmulo.

6. Re: Enxugando o código em Shell [RESOLVIDO]

Enviado em 14/07/2020 - 20:45h


awk 'BEGIN{RS="\n\n";FS="[\n:]";} {print NR,NF,$2}' /var/lib/dpkg/status

Achei bom, mas não serviu para mim. No fim, adaptei a primeira sugestão e ficou assim:

apt list --installed | sed -e 's| \[.*\]||g' -e 's|/[^ ]*now |_|g' -e 's| |_|g' -e '1d' > $L1 


___________________________________
Conhecimento não se Leva para o Túmulo.

7. Re: Enxugando o código em Shell [RESOLVIDO]

Enviado em 14/07/2020 - 20:57h


Resultado final:

8. Re: Enxugando o código em Shell [RESOLVIDO]

Enviado em 15/07/2020 - 01:16h

mauricio123 escreveu:


awk 'BEGIN{RS="\n\n";FS="[\n:]";} {print NR,NF,$2}' /var/lib/dpkg/status

Achei bom, mas não serviu para mim. No fim, adaptei a primeira sugestão e ficou assim:

apt list --installed | sed -e 's| \[.*\]||g' -e 's|/[^ ]*now |_|g' -e 's| |_|g' -e '1d' > $L1 


___________________________________
Conhecimento não se Leva para o Túmulo.

del_lines='^Essential|^Source|^Depends|^Suggests|^Multi-Arch'
sed -r "/${del_lines}/d" /var/lib/dpkg/status|awk 'BEGIN{RS="\n\n";FS="[\n:]";} {gsub(" ","");OFS="_";print $2,$16,$14}'
Ou
print_lines='/Package/p;/Architecture/p;/Version/p;/^$/p'
sed -n "${print_lines}" /var/lib/dpkg/status|awk 'BEGIN{RS="\n\n";FS="[\n:]";} {gsub(" ","");OFS="_";print $2,$4,$6}'


______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________

9. Re: Enxugando o código em Shell [RESOLVIDO]

Enviado em 15/07/2020 - 21:32h

del_lines='^Essential|^Source|^Depends|^Suggests|^Multi-Arch'
sed -r "/${del_lines}/d" /var/lib/dpkg/status|awk 'BEGIN{RS="\n\n";FS="[\n:]";} {gsub(" ","");OFS="_";print $2,$16,$14}'
Ou
print_lines='/Package/p;/Architecture/p;/Version/p;/^$/p'
sed -n "${print_lines}" /var/lib/dpkg/status|awk 'BEGIN{RS="\n\n";FS="[\n:]";} {gsub(" ","");OFS="_";print $2,$4,$6}'

Ambos são bem rápido. Só que o código é muito grande. Talvez eu crie uma versão mais otimizada usando um deles.


___________________________________
Conhecimento não se Leva para o Túmulo.

10. Re: Enxugando o código em Shell [RESOLVIDO]

Enviado em 15/07/2020 - 21:42h


mauricio123 escreveu:

del_lines='^Essential|^Source|^Depends|^Suggests|^Multi-Arch'
sed -r "/${del_lines}/d" /var/lib/dpkg/status|awk 'BEGIN{RS="\n\n";FS="[\n:]";} {gsub(" ","");OFS="_";print $2,$16,$14}'
Ou
print_lines='/Package/p;/Architecture/p;/Version/p;/^$/p'
sed -n "${print_lines}" /var/lib/dpkg/status|awk 'BEGIN{RS="\n\n";FS="[\n:]";} {gsub(" ","");OFS="_";print $2,$4,$6}'

Ambos são bem rápido. Só que o código é muito grande. Talvez eu crie uma versão mais otimizada usando um deles.


___________________________________
Conhecimento não se Leva para o Túmulo.


Só que tem um problema ele não monta a lista no formato que eu quero e o que eu uso compensa até na agilidade. Criar as listas é bem rápido, o problema é o loop que demora um pouco e não consegui fazer um loop mais rápido.

___________________________________
Conhecimento não se Leva para o Túmulo.

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder