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
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
șiapt 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.
|awk -F'/' 'NR>1{print $1}'
la comanda apt list " este posibil cel mai scurt răspuns pentru " apt list numai pentru nume "