Én (egy meglehetősen friss) Debian-alapú disztribúciót futtató rendszeren vagyok.
Szeretnék sima szót generálni egy adott mintának megfelelő összes telepített csomag listája. Ezt megtehetem futással, mondjuk
apt list --installed "linux-image-*" | cut -d/ -f1
, de olyan sorokat kapok, amelyek nem érdekelnek, például:
WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Listing...
Tehát talán jobb, ha nem használom a apt
fájlt. A dpkg-query futtatását így tudom végrehajtani:
dpkg-query --showformat="${Package}\n" --show "linux-image*"
de ez nem korlátozódik a telepített csomagokra. Használhatnám
dpkg-query --list "linux-image-*" | grep "ii"
de akkor egy csomó szövegfeldolgozást kellene elvégeznem, és ki bízhat meg ezekben a helyekben, igaz?
Tehát, végső sor: Mi a jobb módja a mintának megfelelő telepített csomagok listájának megszerzéséhez?
Megjegyzés :
- Bónuszpontok, ha ez megfelelő regexp lehet, nem csak shell-globusz.
- A szöveg elemzése az ideálisnál kevesebb megoldásnak tűnik; ha ezt javasolja, kérem, érveljen, miért nincs jobb módszer.
Válasz
aptitude
támogatja a keresést a csomagkezelő eszközök által ismert telepített vagy egyéb csomagok között, reguláris kifejezések használatával , idegen kimenet nélkül, és meg lehet mondani, hogyan formázzuk a kimenetét:
Csak a telepített csomagok felsorolásához:
aptitude search "linux-image-.* ~i"
Csak a telepített csomagok nevek illeszkedik a reguláris kifejezéshez:
aptitude search "linux-image-.* ~i" -F "%p"
A dokumentáció a rendelkezésre álló keresési mintákat és kimeneti formátum-specifikátorok részletesen. Ezen a webhelyen is talál példákat, például: van-e mód arra, hogy a regexpet használjuk aptitude-val? , regexp a aptitude 2. részével , és a Linux – a biztonsági frissítéseket csak az apt használatával jelenítheti meg vagy frissítheti.
Válasz
$ 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 regexről beszélünk:
$ 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
Használhatja a dpkg-query
fájlt a -f
(–showformat) opcióval is, amely csomagnév nélküli meghívás esetén alapértelmezés szerint csak telepített csomagokat használ fel vannak sorolva.
$ dpkg-query -f "${Package}\n" -W |grep "linux-image" #-W == --show
Megjegyzések
Válasz
Itt egy jó módszer nem kapja meg a elakadt csomagok egy Debian-alapú rendszeren:
dpkg -l | grep ^ii | awk "{print $2}"
Az dpkg -l
kimeneti sorai megbízhatóan megbízhatóak . A ^ii
minta illeszkedik a telepített csomagok soraihoz, és az egyszerű Awk kivonja a második oszlopot, a csomagok nevét (ugyanazok a nevek, amelyeket a apt-get install
parancsok). A csomagnevek nem tartalmazhatnak szóközt, így ez ismét biztonságos művelet.
Megjegyzések
- Ez akkor működik, ha verzió szerint akarsz grepelni. A válaszok
aptitude search
ésapt list
szavakkal ebben az esetben ne ' t.
Válasz
A keresett kifejezés “csapdázása” érdekében, amikor grep ping dpkg output, a keresési kifejezést az alábbiak szerint kell beágyaznia. “ git ” mintapéldány keresési kifejezésként használatos:
dpkg -l |grep "^ii git[[:space:]]"
A karát (^) ii , majd a keresett kifejezést megelőző (2) szóköz biztosítja, hogy semmi A ELŐTT a karakterkombinációtól eltérő lehet.
A [[:space:]]
a keresett kifejezés mellé állítva kizárja a részleges egyezések előfordulását azáltal, hogy csak a szóközök azonnal megegyeznek azt követően.
|awk -F'/' 'NR>1{print $1}'
hozzáadása az apt listához "