De juiste manier om de lijst met geïnstalleerde pakketten te krijgen die overeenkomen met een patroon?

Ik “ben op een systeem met een (redelijk recente-) op Debian gebaseerde distributie.

Ik” zou graag een gewone lijst met alle geïnstalleerde pakketten die overeenkomen met een bepaald patroon. Ik kan dat doen door, zeg maar,

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

te draaien, maar ik krijg regels waar ik niet om geef, bijvoorbeeld:

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

Dus misschien “kan ik” beter apt niet gebruiken. Ik kan dpkg-query als volgt uitvoeren:

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

maar dat “is niet beperkt tot geïnstalleerde pakketten. Ik zou

maar dan” zou ik een hoop tekst moeten verwerken, en wie kan die spaties vertrouwen, toch?

Kortom: wat is de juiste manier om de lijst met geïnstalleerde pakketten te krijgen die overeenkomen met een patroon?


Opmerking :

  • Bonuspunten als het een goede regexp kan zijn in plaats van alleen een shell-glob.
  • De tekst moeten ontleden lijkt een niet-ideale oplossing; als dat is wat je suggereert, geef dan aan waarom er geen “betere manier is.

Answer

aptitude ondersteunt het zoeken tussen alle pakketten die bekend zijn bij de pakketbeheertools, al dan niet geïnstalleerd, met behulp van reguliere expressies , zonder externe uitvoer, en er kan worden verteld hoe de uitvoer moet worden geformatteerd:

Alleen geïnstalleerde pakketten weergeven:

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

Alleen geïnstalleerde pakket namen komt overeen met de reguliere expressie:

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

De documentatie behandelt de beschikbare zoekpatronen en specificatie van uitvoerformaat in detail. U vindt ook voorbeelden op deze site, bijvoorbeeld is er een manier om regexp te gebruiken met aptitude? , regexp met aptitude deel 2 , en Linux – beveiligingsupdates alleen weergeven of upgraden met apt .

Antwoord

$ 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 

Over regex gesproken:

$ 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 

Je kunt ook de dpkg-query gebruiken met de -f (–showformat) optie, die wanneer aangeroepen zonder enige pakketnaam, standaard alleen geïnstalleerde pakketten worden weergegeven.

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

Reacties

  • " voeg |awk -F'/' 'NR>1{print $1}' toe aan apt list-commando " is mogelijk kortste antwoord voor " apt list only names "

Antwoord

Hier is een goede manier om haal de lijst met in vastgelopen pakketten op een op Debian gebaseerd systeem:

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

De uitvoerregels van dpkg -l kunnen als gezond worden beschouwd . Het patroon ^ii komt overeen met de regels van geïnstalleerde pakketten, en de eenvoudige Awk extraheert de tweede kolom, de pakketnamen (dezelfde namen die worden gebruikt in apt-get install opdrachten). Pakketnamen mogen geen spaties bevatten, dus dit is weer een veilige operatie.

Opmerkingen

  • Dit werkt als je wilt grijpen op versie. De antwoorden met aptitude search en apt list in dit geval niet ' t.

Antwoord

Om de gezochte term te “vangen” wanneer grep ping dpkg output, moet de zoekterm als volgt omsluiten. “ git ” wordt gebruikt als de voorbeeldzoekterm:

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

De karaat (^) ii gevolgd door (2) spaties voor de gezochte term zorgt ervoor dat er niets VOOR kan een andere tekencombinatie overeenkomen.

De [[:space:]] grenst aan de gezochte term sluit gedeeltelijke overeenkomsten uit door alleen spaties onmiddellijk NA overeen te laten komen.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *