Enxugando o código em Shell [RESOLVIDO]

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

Mauricio Ferrari
mauricio123

(usa Slackware)

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.





  


2. MELHOR RESPOSTA

Ryuk Shinigami
Ryuk

(usa Nenhuma)

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

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


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

Mauricio Ferrari
mauricio123

(usa Slackware)

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]

Marcelo Oliver
msoliver

(usa Debian)

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]

Mauricio Ferrari
mauricio123

(usa Slackware)

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]

Mauricio Ferrari
mauricio123

(usa Slackware)

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]

Mauricio Ferrari
mauricio123

(usa Slackware)

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


Resultado final:


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

Marcelo Oliver
msoliver

(usa Debian)

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]

Mauricio Ferrari
mauricio123

(usa Slackware)

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]

Mauricio Ferrari
mauricio123

(usa Slackware)

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.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts