Modo giusto per ottenere lelenco dei pacchetti installati che corrispondono a un modello?

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

Mi piacerebbe generare una semplice elenco di tutti i pacchetti installati che corrispondono a un determinato modello. Posso farlo eseguendo, diciamo,

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

ma ottengo righe che non mi interessano, ad esempio:

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

Quindi forse “farei meglio a non usare 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 avrei bisogno di fare un po di elaborazione del testo, e chi può fidarsi di quegli spazi, giusto?

Quindi, in ultima analisi: qual è il right modo per ottenere lelenco dei pacchetti installati che corrispondono a uno schema?


Nota :

  • Punti bonus se può essere una corretta regexp anziché solo un glob di shell.
  • Dover analizzare il testo sembra una soluzione tuttaltro che ideale; se è quello che suggerisci, per favore spiega perché non esiste “un modo migliore”.

Risposta

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

Per elencare solo i pacchetti installati:

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

Per elencare solo i nomi corrispondente allespressione regolare:

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

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

Risposta

$ 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 utilizzare dpkg-query con lopzione -f (–showformat), che se invocata senza alcun nome di pacchetto, per impostazione predefinita solo i pacchetti installati sono elencati.

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

Commenti

  • " aggiungi |awk -F'/' 'NR>1{print $1}' a apt list command " è possibile la risposta più breve per " apt list solo nomi "

Rispondi

Ecco un buon modo per ottieni lelenco di in pacchetti bloccati su un sistema basato su Debian:

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

Le righe di output di dpkg -l possono essere considerate sane . Il pattern ^ii corrisponderà alle righe dei pacchetti installati e il semplice Awk estrarrà la seconda colonna, i nomi dei pacchetti (gli stessi nomi usati in apt-get install comandi). I nomi dei pacchetti non possono contenere spazi, quindi anche questa è unoperazione sicura.

Commenti

  • Funziona quando vuoi grep per versione. Le risposte con aptitude search e apt list in questo caso don ' t.

Risposta

Per “intercettare” il termine cercato quando grep ping dpkg output, è necessario racchiudere il termine di ricerca come segue. “ git ” viene utilizzato come termine di ricerca del campione:

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

carat (^) ii seguito da (2) spazi che precedono il termine cercato non garantiscono nulla BEFORE può corrispondere a una combinazione di caratteri diversa da quella.

[[:space:]] accanto al termine cercato impedisce che si verifichino corrispondenze parziali facendo corrispondere solo gli spazi immediatamente DOPO .

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *