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
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
ochapt 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.
|awk -F'/' 'NR>1{print $1}'
till apt list-kommando " är möjligt kortaste svaret för " endast apt-lista "