Správný způsob, jak získat seznam nainstalovaných balíků odpovídajících vzoru?

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

  • " přidat |awk -F'/' 'NR>1{print $1}' do příkazu apt list " je možná nejkratší odpověď pro " apt list only names "

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 a apt 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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *