La bonne façon dobtenir la liste des packages installés correspondant à un modèle?

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

  • " ajouter |awk -F'/' 'NR>1{print $1}' à la commande apt list " est la réponse la plus courte possible pour " apt list only names "

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 et apt 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *