Właściwy sposób na uzyskanie listy zainstalowanych pakietów pasujących do wzorca?

Jestem na systemie z (całkiem niedawną) dystrybucją opartą na Debianie.

Chciałbym wygenerować zwykły lista wszystkich zainstalowanych pakietów pasujących do określonego wzorca. Mogę to zrobić, uruchamiając, powiedzmy,

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

, ale dostaję wiersze, na których mi nie zależy, np .:

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

Więc może lepiej nie używać apt. Mogę uruchomić dpkg-query w ten sposób:

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

ale to nie jest ograniczone do zainstalowanych pakietów. Mogę użyć

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

ale wtedy musiałbym trochę przetworzyć tekst i kto może ufać tym przestrzeniom, prawda?

Zatem podsumowanie: co to za right sposób uzyskania listy zainstalowanych pakietów pasujących do wzorca?


Uwaga :

  • Dodatkowe punkty, jeśli może to być prawidłowe wyrażenie regularne, a nie zwykła globalna powłoka.
  • Konieczność przeanalizowania tekstu wydaje się być mniej niż idealnym rozwiązaniem; jeśli sugerujesz to, proszę argumentuj, dlaczego nie ma lepszego sposobu.

Odpowiedź

aptitude obsługuje wyszukiwanie wśród wszystkich pakietów znanych narzędziom do zarządzania pakietami, zainstalowanych lub nie, przy użyciu wyrażeń regularnych , bez zbędnych danych wyjściowych i można powiedzieć, jak sformatować jego wyjście:

Aby wyświetlić tylko zainstalowane pakiety:

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

Aby wyświetlić tylko nazwy zainstalowanych pakietów pasujące do wyrażenia regularnego:

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

Dokumentacja obejmuje dostępne wzorce wyszukiwania i specyfikatory formatu wyjściowego szczegółowo. W tej witrynie znajdziesz również przykłady, na przykład czy istnieje sposób używania wyrażenia regularnego z aptitude? , regexp z aptitude część 2 i Linux – wyświetl lub zaktualizuj aktualizacje zabezpieczeń tylko przy użyciu apt .

Odpowiedź

$ 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 

A propos wyrażenia regularnego:

$ 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 

Możesz także użyć opcji dpkg-query z opcją -f (–showformat), która po wywołaniu bez nazwy pakietu domyślnie instaluje tylko pakiety są wymienione.

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

Komentarze

  • " dodaj |awk -F'/' 'NR>1{print $1}' do polecenia apt list " jest możliwa najkrótsza odpowiedź dla " apt lista tylko nazwy "

Odpowiedź

Oto dobry sposób uzyskać listę w zablokowane pakiety w systemie opartym na Debianie:

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

Można ufać, że linie wyjściowe dpkg -l są rozsądne . Wzorzec ^ii będzie pasował do wierszy zainstalowanych pakietów, a prosty Awk wyodrębni drugą kolumnę, nazwy pakietów (te same nazwy użyte w apt-get install polecenia). Nazwy pakietów nie mogą zawierać białych znaków, więc jest to znowu bezpieczna operacja.

Komentarze

  • Działa to, gdy chcesz grepować według wersji. Odpowiedzi zawierające aptitude search i apt list w tym przypadku nie ' t.

Odpowiedź

Aby „przechwycić” wyszukiwane hasło, gdy grep ping dpkg output, należy umieścić wyszukiwany termin w następujący sposób. „ git ” jest używane jako przykładowe hasło wyszukiwania:

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

karat (^) ii , po których następują (2) spacje poprzedzające wyszukiwany termin, nic nie gwarantuje PRZED może pasować inna kombinacja znaków niż ta.

[[:space:]] sąsiadujące z wyszukiwanym terminem wyklucza występowanie częściowych dopasowań przez natychmiastowe dopasowanie spacji AFTER it.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *