Modo giusto per ottenere l'elenco dei pacchetti installati che corrispondono a un modello?


11

Sono su un sistema che esegue una distribuzione (abbastanza recente) basata su Debian.

Vorrei generare un semplice elenco di tutti i pacchetti installati che corrispondano a un determinato modello. Posso farlo correndo, per esempio,

apt list --installed "linux-image-*" | cut -d/ -f1

ma ottengo linee che non mi interessano, ad esempio:

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Listing...

Quindi forse è meglio non usarlo apt. Posso eseguire dpkg-query in questo modo:

dpkg-query --showformat='${Package}\n' --show "linux-image*"

ma non è limitato ai pacchetti installati. Potrei usare

dpkg-query --list "linux-image-*" | grep "ii"

ma poi dovrei fare un sacco di elaborazioni di testo, e chi può fidarsi di quegli spazi, giusto?

Quindi, linea di fondo: qual è il modo giusto per ottenere l'elenco dei pacchetti installati che corrispondono a un modello?


Nota :

  • Punti bonus se può essere una regexp corretta anziché solo un glob shell.
  • Dover analizzare il testo sembra una soluzione tutt'altro che ideale; se è quello che suggerisci, ti preghiamo di spiegare perché non esiste un modo migliore.

Risposte:


8

aptitude supporta la ricerca tra tutti i pacchetti noti agli strumenti di gestione dei pacchetti, installati o meno, usando espressioni regolari, senza output estraneo, e può essere detto come formattare il suo output:

aptitude search "linux-image-.*"

Per elencare solo i pacchetti installati:

aptitude search "linux-image-.* ~i"

Per elencare solo i nomi dei pacchetti installati che corrispondono all'espressione regolare:

aptitude search "linux-image-.* ~i" -F "%p"

La documentazione tratta in dettaglio i modelli di ricerca disponibili e gli identificatori del formato di output . Troverai anche esempi su questo sito, ad esempio c'è un modo per usare regexp con aptitude? , regexp con aptitude parte 2 e Linux - mostra o aggiorna gli aggiornamenti di sicurezza solo usando apt .


6

Ecco un buon modo per ottenere l'elenco dei pacchetti installati su un sistema basato su Debian:

dpkg -l | grep ^ii | awk '{print $2}'

Le linee di output di dpkg -lpossono essere considerate sane. Il modello ^iicorrisponderà alle linee dei pacchetti installati e il semplice Awk estrarrà la seconda colonna, i nomi dei pacchetti (gli stessi nomi utilizzati nei apt-get installcomandi). I nomi dei pacchetti non possono contenere spazi bianchi, quindi anche questa è un'operazione sicura.


Funziona quando vuoi grep per versione. Le risposte con aptitude searche apt listin questo caso no.
Hi-Angel,

6
$ apt list --installed "linux-image-*" 2>/dev/null |awk -F'/' 'NR>1{print $1}'
linux-image-3.16.0-4-amd64
linux-image-4.11.0-1-amd64
linux-image-4.12.0-1-amd64
linux-image-4.13.0-1-amd64
linux-image-4.8.0-2-amd64
linux-image-4.9.0-1-amd64
linux-image-4.9.0-2-amd64
linux-image-4.9.0-3-amd64

Parlando di regex:

$ apt list --installed "linux-image-*" 2>/dev/null |awk -F'/' 'NR>1 && $0~/4.1/{print $1}'
linux-image-4.11.0-1-amd64
linux-image-4.12.0-1-amd64
linux-image-4.13.0-1-amd64

Puoi anche usare dpkg-querycon l' -fopzione (--showformat), che quando viene invocata senza alcun nome di pacchetto, per impostazione predefinita sono elencati solo i pacchetti installati.

$ dpkg-query -f '${Package}\n' -W |grep 'linux-image' #-W == --show

1

Per "intercettare" il termine cercato quando grep ping dpkg produce l' output, è necessario racchiudere il termine di ricerca come segue. " git " è usato come termine di ricerca del campione:

dpkg -l |grep "^ii  git[[:space:]]"

I carati (^) ii seguiti da (2) spazi che precedono il termine cercato non garantiscono nulla PRIMA che la combinazione di caratteri possa corrispondere.

L' [[:space:]]impostazione del termine cercato impedisce che si verifichino corrispondenze parziali solo dopo il confronto degli spazi immediatamente dopo .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.