Riktig måte å få listen over installerte pakker som samsvarer med et mønster?

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

  • " legg til |awk -F'/' 'NR>1{print $1}' til apt list-kommando " er mulig korteste svar for " apt list bare navn "

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 og apt 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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *