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
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
iapt 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.
|awk -F'/' 'NR>1{print $1}'
do polecenia apt list " jest możliwa najkrótsza odpowiedź dla " apt lista tylko nazwy "