Jsem v systému, který používá (poměrně nedávnou) distribuci založenou na Debianu.
Chtěl bych vygenerovat prostý seznam všech nainstalovaných balíků odpovídajících určitému vzoru. Mohu to udělat spuštěním, řekněme,
apt list --installed "linux-image-*" | cut -d/ -f1
, ale dostanu řádky, o které se nestarám, např .:
WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Listing...
Takže možná bych raději nepoužíval apt
. Mohu spustit dpkg-query takhle:
dpkg-query --showformat="${Package}\n" --show "linux-image*"
, ale to se neomezuje pouze na nainstalované balíčky. Mohu použít
dpkg-query --list "linux-image-*" | grep "ii"
ale potom bych musel udělat spoustu zpracování textu a kdo může těmto prostorům důvěřovat, že?
Takže spodní řádek: Co je to vpravo způsob, jak získat seznam nainstalovaných balíků odpovídajících vzoru?
Poznámka :
- Bonusové body, pokud se může jednat spíše o správný regulární výraz než o pouhý globus prostředí.
- Analyzovat text se jeví jako méně než ideální řešení; pokud to navrhujete, argumentujte, proč neexistuje lepší způsob.
Odpověď
aptitude
podporuje vyhledávání mezi všemi balíčky známými nástroji pro správu balíčků, nainstalovanými nebo jinak, pomocí regulárních výrazů , bez cizího výstupu, a lze říci, jak formátovat jeho výstup:
Chcete-li zobrazit pouze nainstalované balíčky:
aptitude search "linux-image-.* ~i"
Chcete-li zobrazit pouze nainstalované balíčky názvy odpovídající regulárnímu výrazu:
aptitude search "linux-image-.* ~i" -F "%p"
Dokumentace pokrývá dostupné vzory vyhledávání a specifikátory výstupního formátu podrobně. Na tomto webu také najdete příklady, například existuje způsob, jak použít regexp s aptitude? , regexp s aptitude část 2 a Linux – zobrazovat nebo upgradovat aktualizace zabezpečení pouze pomocí apt .
Odpověď
$ 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
Hovoříme o regexu:
$ 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
Můžete také použít dpkg-query
s možností -f
(–showformat), která při vyvolání bez názvu balíčku ve výchozím nastavení pouze nainstalované balíčky jsou uvedeny.
$ dpkg-query -f "${Package}\n" -W |grep "linux-image" #-W == --show
Komentáře
Odpověď
Tady je jeden dobrý způsob, jak dostat seznam v zastavené balíčky v systému založeném na Debianu:
dpkg -l | grep ^ii | awk "{print $2}"
Lze věřit, že jsou rozumné výstupní řádky dpkg -l
. Vzor ^ii
bude odpovídat řádkům nainstalovaných balíků a jednoduchý Awk extrahuje druhý sloupec, názvy balíčků (stejná jména použitá v apt-get install
příkazy). Názvy balíků nemohou obsahovat mezery, takže jde opět o bezpečnou operaci.
Komentáře
- Funguje to, pokud chcete grepovat podle verze. Odpovědi
aptitude search
aapt list
v tomto případě don ' t.
Odpovědět
Chcete-li „chytit“ hledaný výraz, když grep ping dpkg výstup, je třeba zapouzdřit hledaný výraz následujícím způsobem. „ git “ se používá jako hledaný výraz:
dpkg -l |grep "^ii git[[:space:]]"
karát (^) ii následovaný (2) mezerami před hledaným výrazem nic nezajistí PŘED se může shodovat i jiná kombinace znaků.
[[:space:]]
přiléhající k hledanému výrazu vylučuje, aby k částečným shodám došlo pouze okamžitým porovnáním mezer PO it.
|awk -F'/' 'NR>1{print $1}'
do příkazu apt list " je možná nejkratší odpověď pro " apt list only names "