Mod corect pentru a obține lista pachetelor instalate care se potrivesc cu un model?

Sunt „pe un sistem care rulează o distribuție (destul de recentă) bazată pe Debian.

Aș dori să generez o simplă lista tuturor pachetelor instalate care corespund unui anumit model. Pot să fac asta, alergând, să zicem,

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

dar primesc linii care nu îmi pasă, de exemplu:

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

Deci poate că ar fi bine să nu folosesc apt. Pot rula dpkg-query astfel:

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

dar asta nu se limitează la pachetele instalate. Aș putea folosi

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

dar atunci ar trebui să fac o grămadă de procesare a textului și cine poate avea încredere în acele spații, nu?

Deci, linia de jos: Ce este dreapta mod de a obține lista pachetelor instalate care se potrivesc cu un model?


Notă :

  • Puncte bonus dacă poate fi o regexp adecvată mai degrabă decât doar un glob de coajă.
  • Trebuie să analizați textul pare o soluție mai puțin decât ideală; dacă asta sugerați, vă rugăm să argumentați de ce nu există o cale mai bună.

Răspuns

aptitude acceptă căutarea printre toate pachetele cunoscute de instrumentele de gestionare a pachetelor, instalate sau altfel, folosind expresii regulate , fără ieșire străină și i se poate spune cum să-i formatați ieșirea:

Pentru a lista numai pachetele instalate:

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

Pentru a lista numai pachetele instalate nume care se potrivește cu expresia regulată:

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

Documentația acoperă tiparele de căutare disponibile și specificatori de format de ieșire în detaliu. Veți găsi, de asemenea, exemple pe acest site, de exemplu există o modalitate de a utiliza regexp cu aptitude? , regexp cu aptitude partea 2 și Linux – afișați sau actualizați actualizările de securitate numai folosind apt .

Răspuns

$ 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 

Vorbind despre 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 

De asemenea, puteți utiliza dpkg-query cu opțiunea -f (–showformat), care, atunci când este invocată fără nici un nume de pachet, implicit, numai pachetele instalate sunt listate.

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

Comentarii

  • " adăugați |awk -F'/' 'NR>1{print $1}' la comanda apt list " este posibil cel mai scurt răspuns pentru " apt list numai pentru nume "

Răspuns

Iată un mod bun de a obțineți lista cu pachete blocate pe un sistem bazat pe Debian:

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

Liniile de ieșire ale dpkg -l pot fi de încredere pentru a fi sănătoase . Modelul ^ii se va potrivi cu liniile pachetelor instalate, iar Awk-ul simplu va extrage a doua coloană, numele pachetelor (aceleași nume utilizate în apt-get install comenzi). Numele pachetelor nu pot conține spații albe, deci aceasta este din nou o operațiune sigură.

Comentarii

  • Acest lucru funcționează atunci când doriți să grep după versiune. Răspunsurile cu aptitude search și apt list în acest caz nu ' t.

Răspuns

Pentru a „prinde” termenul căutat când grep ping dpkg output, trebuie să încadrați termenul de căutare după cum urmează. „ git ” este folosit ca termen de căutare specimen:

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

carat (^) ii urmat de (2) spații care precedă termenul căutat nu asigură nimic ÎNAINTE de se poate potrivi altceva decât combinația de caractere.

[[:space:]] adiacent termenului căutat împiedică apariția potrivirilor parțiale numai prin potrivirea spațiilor imediat DUPĂ acesta.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *