Jeg er på systemet som kjører en (ganske nylig-) Debian-basert distribusjon.
Jeg vil generere en vanlig liste over alle installerte pakker som samsvarer med et bestemt mønster. Jeg kan gjøre det ved å løpe, si,
apt list --installed "linux-image-*" | cut -d/ -f1
men jeg får linjer jeg ikke bryr meg om, f.eks:
WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Listing...
Så kanskje jeg ikke burde bruke apt
. Jeg kan kjøre dpkg-spørring slik:
dpkg-query --showformat="${Package}\n" --show "linux-image*"
men det er ikke begrenset til installerte pakker. Jeg kan bruke
dpkg-query --list "linux-image-*" | grep "ii"
men da trenger jeg å gjøre en mengde tekstbehandling, og hvem kan stole på disse mellomrommene, ikke sant?
Så, bunnlinjen: Hva er høyre måte å få listen over installerte pakker som samsvarer med et mønster?
Merk :
- Bonuspoeng hvis det kan være en skikkelig regexp i stedet for bare en skallglob.
- Å måtte analysere teksten virker som en mindre enn ideell løsning. Hvis det er det du foreslår, kan du argumentere for hvorfor det ikke finnes en bedre måte.
Svar
aptitude
støtter søk blant alle pakker som er kjent for pakkestyringsverktøyene, installert eller på annen måte, ved å bruke vanlige uttrykk uten utenomgående utdata, og kan bli fortalt hvordan man formaterer utdataene:
For å liste opp bare installerte pakker:
aptitude search "linux-image-.* ~i"
For å liste bare installerte pakker navn samsvarer med det vanlige uttrykket:
aptitude search "linux-image-.* ~i" -F "%p"
Dokumentasjonen dekker tilgjengelige søkemønstre og spesifikasjoner for utdataformat i detalj. Du finner også eksempler på dette nettstedet, for eksempel er det en måte å bruke regexp med aptitude? , regexp med aptitude del 2 , og Linux – vis eller oppgrader sikkerhetsoppdateringer bare ved hjelp av 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
Snakker 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å bruke dpkg-query
med -f
(–showformat) -alternativet, som når det påkalles uten noe pakkenavn, som standard bare installerte pakker er oppført.
$ dpkg-query -f "${Package}\n" -W |grep "linux-image" #-W == --show
Kommentarer
Svar
Her er en god måte å får listen over inn stoppede pakker på et Debian-basert system:
dpkg -l | grep ^ii | awk "{print $2}"
Utgangslinjene til dpkg -l
kan stole på å være tilregnelige . Mønsteret ^ii
vil matche linjene til installerte pakker, og den enkle Awk vil trekke ut den andre kolonnen, pakkenavnene (de samme navnene som brukes i apt-get install
kommandoer). Pakkenavn kan ikke inneholde mellomrom, så dette er igjen en sikker operasjon.
Kommentarer
- Dette fungerer når du vil grep etter versjon. Svarene med
aptitude search
ogapt list
i dette tilfellet don ' t.
Svar
For å «fange» det søkte ordet når grep ping dpkg output, må du omslutte søkeordet som følger. « git » brukes som søkeord for prøven:
dpkg -l |grep "^ii git[[:space:]]"
karat (^) ii etterfulgt av (2) mellomrom som ligger foran den søkte termen, sikrer ingenting FØR det annet enn at kombinasjonen av tegn kan matche.
[[:space:]]
som ligger an mot det søkte ordet utelukker at partielle treff oppstår ved bare å matche mellomrom umiddelbart ETTER det.
|awk -F'/' 'NR>1{print $1}'
til apt list-kommando " er mulig korteste svar for " apt list bare navn "