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
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
eapt 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 .
|awk -F'/' 'NR>1{print $1}'
a apt list command " è possibile la risposta più breve per " apt list solo nomi "