Rätt sätt att få listan över installerade paket som matchar ett mönster?

I ”m på system som kör en (ganska ny-) Debian-baserad distribution.

Jag skulle vilja skapa en vanlig lista över alla installerade paket som matchar ett visst mönster. Jag kan göra det genom att springa, säg,

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

men jag får rader som jag inte bryr mig om, t.ex.:

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

Så jag kanske inte vill använda apt. Jag kan köra dpkg-fråga så här:

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

men det är inte begränsat till installerade paket. Jag kan använda

dpkg-query --list "linux-image-*" | grep "ii" 

men då skulle jag behöva göra en massa textbearbetning, och vem kan lita på dessa mellanslag, eller hur?

Så, botten: Vad är höger sätt att få listan över installerade paket som matchar ett mönster?


Obs :

  • Bonuspoäng om det kan vara en ordentlig regexp snarare än bara en skalglob.
  • Att behöva analysera texten verkar vara en mindre än idealisk lösning, om det är vad du föreslår, argumentera varför det inte finns något bättre sätt.

Svar

aptitude stöder sökning bland alla paket som är kända för pakethanteringsverktygen, installerade eller på annat sätt, med hjälp av reguljära uttryck , utan främmande utdata, och kan få veta hur man formaterar utdata:

För att lista endast installerade paket:

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

För att lista endast installerade paket namn matchar det reguljära uttrycket:

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

Dokumentationen täcker tillgängliga sökmönster och specifikationer för utdataformat i detalj. Du hittar också exempel på den här webbplatsen, till exempel finns det ett sätt att använda regexp med aptitude? , regexp med aptitude del 2 och Linux – visa eller uppgradera säkerhetsuppdateringar endast med apt .

Svar

$ 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 

Pratar om 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 

Du kan också använda dpkg-query med -f (–showformat) alternativet, som när det anropas utan något paketnamn, som standard bara installerade paket listas.

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

Kommentarer

  • " lägg till |awk -F'/' 'NR>1{print $1}' till apt list-kommando " är möjligt kortaste svaret för " endast apt-lista "

Svar

Här är ett bra sätt att får listan över stoppade paket på ett Debian-baserat system:

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

Utgångslinjerna för dpkg -l kan lita på att de är sunda . Mönstret ^ii matchar raderna för installerade paket och den enkla Awk extraherar den andra kolumnen, paketnamnen (samma namn som används i apt-get install kommandon). Paketnamn får inte innehålla mellanslag, så det här är en säker åtgärd.

Kommentarer

  • Detta fungerar när du vill grep efter version. Svaren med aptitude search och apt list i detta fall don ' t.

Svar

För att ”fånga” den sökte termen när grep ping dpkg output, måste ange söktermen enligt följande. ” git ” används som exemplets sökord:

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

karat (^) ii följt av (2) mellanslag som ligger före den sökte termen säkerställer ingenting INNAN det kan vara annat än att kombinationen av tecken kan matcha.

[[:space:]] som ligger intill den sökte termen förhindrar att partiella matchningar förekommer genom att endast matcha mellanslag omedelbart EFTER det.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *