como aparar a lista de pacotes atualizados do dpkg

1

A atualização mais recente borked meu sistema e estou tentando reverter a última atualização. Eu abri meu comp com USB ao vivo e chrooted para particionar o sistema operacional instalado. Eu recebo os pacotes atualizados com

cat /var/log/dpkg.log | grep upgrade >>upgradeddpkg

Ele lista pakages como

2014-03-14 15:31:45 upgrade libprocps0:i386 1:3.3.3-2ubuntu5.3 1:3.3.3-3
2014-03-14 15:31:52 upgrade libreadline-dev:i386 6.2-9ubuntu1 6.2+dfsg-0.1
2014-03-14 15:31:53 upgrade libreadline6-dev:i386 6.2-9ubuntu1 6.2+dfsg-0.1
2014-03-14 15:31:55 upgrade readline-common:all 6.2-9ubuntu1 6.2+dfsg-0.1
2014-03-14 15:32:25 upgrade libreadline6:i386 6.2-9ubuntu1 6.2+dfsg-0.1
2014-03-14 15:32:33 upgrade libudev0:i386 175-0ubuntu19 175-7.2
2014-03-14 15:32:40 upgrade libdevmapper-dev:i386 2:1.02.74-6ubuntu4 2:1.02.74-8
2014-03-14 15:32:42 upgrade libdevmapper-event1.02.1:i386 2:1.02.74-6ubuntu4 2:1.02.74-8
2014-03-14 15:32:43 upgrade libdevmapper1.02.1:i386 2:1.02.74-6ubuntu4 2:1.02.74-8
2014-03-14 15:32:44 upgrade dmsetup:i386 2:1.02.74-6ubuntu4 2:1.02.74-8

Como posso obter apenas o nome dos pacotes por meio do grep, awk ou qualquer outra ferramenta?

    
por kenn 15.03.2014 / 11:50

2 respostas

3

Experimente o comando abaixo,

awk ' { print  } ' upgradeddpkg > upgrade.txt

Se você não quiser os dois pontos : , execute

awk -F ':' ' { print  } ' upgrade.txt > upgrade1.txt

Explicação:

awk ' { print  } ' upgradeddpkg > upgrade.txt

Neste, awk pega a entrada de upgradeddpkg e imprime apenas os $ 4 (coluna número 4) .Essa saída foi redirecionada para upgrade.txt file.So arquivo upgrade.txt contém apenas os nomes dos pacotes com dois pontos. Para remover o cólon e sua próxima parte (seguinte), você tem que executar o segundo comando. Por padrão o awk considera o espaço como um delimitador.

awk -F ':' ' { print  } ' upgrade.txt > upgrade1.txt

Delimitador de cólon foi definido manualmente e awk considera o cólon como um delimitador em vez de espaço.Agora awk pega a entrada (stdin) do arquivo upgrade.txt e imprime (stdout) a coloumn1 (parte antes dos dois pontos) .Finalmente a saída padrão foi redirecionado para upgrade1.txt .Agora contém apenas os nomes dos pacotes.

    
por Avinash Raj 15.03.2014 / 11:54
3

Existe um problema ao usar o grep para a pesquisa inicial, pois inclui itens como ubuntu-release-upgrader-core:all . Eu usaria um único awk para combinar e escolher o campo certo.

awk '=="upgrade" { print  }' /var/log/dpkg.log

Por padrão, o awk divide cada linha com base em espaços. O terceiro campo é a ação (portanto, verificamos que é igual a "upgrade") e o quarto é o nome do pacote.

Alguns pacotes são atualizados bastante para que você possa eliminar o ruído de duplicatas com:

awk '=="upgrade" { print  }' /var/log/dpkg.log | sort -u

Eu já vi a resposta da Avinash agora ... Eu seria um pouco cauteloso em cortar as arquiteturas ... Dependendo do que você está fazendo, elas podem ser tão relevantes quanto o nome do pacote ... Mas se você queria cortá-los, eu provavelmente faria isso na mesma declaração awk :

awk '=="upgrade" { split(, a, ":"); print a[1] }' /var/log/dpkg.log | sort -u

Como alternativa, você pode definir vários separadores de campos para awk , para dividir qualquer em espaços ou em dois pontos:

awk -F'[ :]' '=="upgrade" { print  }' /var/log/dpkg.log
    
por Oli 15.03.2014 / 12:04