I “m på system, der kører en (ret nylig-) Debian-baseret distribution.
Jeg vil gerne generere en almindelig liste over alle installerede pakker, der matcher et bestemt mønster. Jeg kan gøre det ved at løbe, sige,
apt list --installed "linux-image-*" | cut -d/ -f1
men jeg får linjer, som jeg ikke bryr mig om, fx:
WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Listing...
Så måske ville jeg hellere ikke bruge apt
. Jeg kan køre dpkg-forespørgsel sådan:
dpkg-query --showformat="${Package}\n" --show "linux-image*"
men det er ikke begrænset til installerede pakker. Jeg kunne bruge
dpkg-query --list "linux-image-*" | grep "ii"
men så er jeg nødt til at lave en masse tekstbehandling, og hvem kan stole på disse mellemrum, ikke?
Så bundlinjen: Hvad er højre måde at få listen over installerede pakker, der matcher et mønster?
Bemærk :
- Bonuspoint, hvis det kan være en ordentlig regexp snarere end blot en shell-glob.
- At skulle analysere teksten virker som en mindre end ideel løsning. Hvis det er det, du foreslår, skal du argumentere for, hvorfor der ikke er en bedre måde.
Svar
aptitude
understøtter søgning blandt alle pakker, der er kendt for pakkehåndteringsværktøjerne, installeret eller på anden måde ved hjælp af regulære udtryk uden udenlandsk output og kan få at vide, hvordan man formaterer dets output:
For at liste kun installerede pakker:
aptitude search "linux-image-.* ~i"
For at liste kun installeret pakke navne matcher det regulære udtryk:
aptitude search "linux-image-.* ~i" -F "%p"
Dokumentationen dækker de tilgængelige søgemønstre og specifikationer for outputformat i detaljer. Du finder også eksempler på dette websted, for eksempel er der en måde at bruge regexp med aptitude? , regexp med aptitude del 2 og Linux – vis eller opgrader kun sikkerhedsopdateringer ved hjælp af 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
Taler 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 også bruge dpkg-query
med -f
(–showformat) -indstilling, som når den påkaldes uden noget pakkenavn, som standard kun installerede pakker er angivet.
$ dpkg-query -f "${Package}\n" -W |grep "linux-image" #-W == --show
Kommentarer
Svar
Her er en god måde at får listen over stallede pakker på et Debian-baseret system:
dpkg -l | grep ^ii | awk "{print $2}"
Outputlinjerne for dpkg -l
kan stole på at være tilregnelige . Mønsteret ^ii
svarer til linjerne med installerede pakker, og den enkle Awk udtrækker den anden kolonne, pakkenavnene (de samme navne, der bruges i apt-get install
kommandoer). Pakkenavne kan ikke indeholde mellemrum, så dette er igen en sikker handling.
Kommentarer
- Dette fungerer, når du vil gribe efter version. Svarene med
aptitude search
ogapt list
i dette tilfælde don ' t.
Svar
For at “fange” det søgte udtryk, når grep ping dpkg output, skal du omslutte søgeudtrykket som følger. “ git ” bruges som eksemplets søgeudtryk:
dpkg -l |grep "^ii git[[:space:]]"
karat (^) ii efterfulgt af (2) mellemrum, der foregår det søgte udtryk, sikrer intet FØR det andet end at kombinationen af tegn kan matche.
[[:space:]]
, der ligger an mod det søgte udtryk udelukker, at delvise matches kun forekommer ved kun at matche mellemrum med det samme EFTER det.
|awk -F'/' 'NR>1{print $1}'
til apt list-kommando " er mulig korteste svar til " apt liste kun navne "