Je « suis sur un système exécutant une distribution (assez récente) basée sur Debian.
Je » voudrais générer un simple liste de tous les packages installés correspondant à un certain modèle. Je peux le faire en exécutant, disons,
apt list --installed "linux-image-*" | cut -d/ -f1
mais jobtiens des lignes qui ne me préoccupent pas, par exemple:
WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Listing...
Alors peut-être que je ferais mieux de ne pas utiliser apt
. Je peux exécuter dpkg-query comme ceci:
dpkg-query --showformat="${Package}\n" --show "linux-image*"
mais cela « nest pas limité aux paquets installés. Je pourrais utiliser
dpkg-query --list "linux-image-*" | grep "ii"
mais alors j » aurais besoin de faire un tas de traitement de texte, et qui peut faire confiance à ces espaces, non?
Donc, en bout de ligne: quel est le right comment obtenir la liste des paquets installés correspondant à un modèle?
Remarque :
- Des points bonus sil peut sagir dune bonne expression rationnelle plutôt que dun simple shell glob.
- Avoir à analyser le texte semble être une solution loin dêtre idéale; si cest ce que vous suggérez, veuillez expliquer pourquoi il ny a pas de meilleur moyen.
Answer
aptitude
prend en charge la recherche parmi tous les packages connus des outils de gestion de packages, installés ou non, à laide dexpressions régulières , sans sortie étrangère, et peut être dit comment formater sa sortie:
Pour ne lister que les packages installés:
aptitude search "linux-image-.* ~i"
Pour ne lister que les noms de packages correspondant à lexpression régulière:
aptitude search "linux-image-.* ~i" -F "%p"
La documentation couvre les modèles de recherche disponibles et spécificateurs de format de sortie en détail. Vous trouverez également des exemples sur ce site, par exemple existe-t-il un moyen dutiliser une expression régulière avec aptitude? , regexp avec aptitude partie 2 et Linux – affichez ou mettez à jour les mises à jour de sécurité uniquement en utilisant apt .
Réponse
$ 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
Parlons de 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
Vous pouvez également utiliser loption dpkg-query
avec loption -f
(–showformat), qui lorsquelle est appelée sans nom de package, par défaut uniquement les packages installés sont répertoriés.
$ dpkg-query -f "${Package}\n" -W |grep "linux-image" #-W == --show
Commentaires
Réponse
Voici « un bon moyen de obtenir la liste des paquets bloqués sur un système basé sur Debian:
dpkg -l | grep ^ii | awk "{print $2}"
Les lignes de sortie de dpkg -l
peuvent être considérées comme saines . Le modèle ^ii
correspondra aux lignes des packages installés, et le simple Awk extraira la deuxième colonne, les noms des packages (les mêmes noms utilisés dans apt-get install
). Les noms de paquet ne peuvent pas contenir despaces, cest donc encore une opération sûre.
Commentaires
- Cela fonctionne lorsque vous voulez grep par version. Les réponses avec
aptitude search
etapt list
dans ce cas don ' t.
Réponse
Afin de « piéger » le terme recherché lorsque grep ping dpkg sortie, vous devez encapsuler le terme de recherche comme suit. « git » est utilisé comme terme de recherche de spécimen:
dpkg -l |grep "^ii git[[:space:]]"
Le carat (^) ii suivi de (2) espaces précédant le terme recherché ne garantit rien AVANT il peut correspondre à une autre combinaison de caractères.
Le [[:space:]]
adjacent au terme recherché empêche les correspondances partielles de se produire en ne faisant correspondre que les espaces immédiatement AFTER it.
|awk -F'/' 'NR>1{print $1}'
à la commande apt list " est la réponse la plus courte possible pour " apt list only names "