Ich bin auf einem System, auf dem eine (relativ aktuelle) Debian-basierte Distribution ausgeführt wird.
Ich möchte eine Ebene generieren Liste aller installierten Pakete, die einem bestimmten Muster entsprechen. Ich kann das tun, indem ich beispielsweise
apt list --installed "linux-image-*" | cut -d/ -f1
ausführe, aber ich erhalte Zeilen, die mir egal sind, z. B.:
WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Listing...
Vielleicht sollte ich apt
besser nicht verwenden. Ich kann dpkg-query wie folgt ausführen:
dpkg-query --showformat="${Package}\n" --show "linux-image*"
, aber das ist nicht auf installierte Pakete beschränkt. Ich könnte
, aber dann müsste ich eine Menge Textverarbeitung durchführen, und wer kann diesen Leerzeichen vertrauen, oder?
Fazit: Was ist das rechts Weg, um die Liste der installierten Pakete abzurufen, die einem Muster entsprechen?
Hinweis :
- Bonuspunkte, wenn es sich um einen richtigen regulären Ausdruck und nicht nur um einen Shell-Glob handeln kann.
- Das Parsen des Textes scheint eine weniger als ideale Lösung zu sein. Wenn Sie dies vorschlagen, argumentieren Sie bitte, warum es keinen besseren Weg gibt.
Antwort
aptitude
unterstützt die Suche unter allen Paketen, die den installierten oder anderweitig installierten Paketverwaltungswerkzeugen bekannt sind, unter Verwendung regulärer Ausdrücke , ohne fremde Ausgabe, und kann gesagt werden, wie seine Ausgabe formatiert werden soll:
So listen Sie nur installierte Pakete auf:
aptitude search "linux-image-.* ~i"
So listen Sie nur installierte Paketnamen auf passend zum regulären Ausdruck:
aptitude search "linux-image-.* ~i" -F "%p"
Die Dokumentation behandelt die verfügbaren Suchmuster und Ausgabeformatspezifizierer im Detail. Auf dieser Site finden Sie auch Beispiele, z. B. Gibt es eine Möglichkeit, Regexp mit Eignung zu verwenden? , Regexp mit Aptitude Teil 2 und Linux – Sicherheitsupdates nur mit apt anzeigen oder aktualisieren.
Antwort
$ 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
Apropos Regex:
$ 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
Sie können dpkg-query
auch mit der Option -f
(–showformat) verwenden, die beim Aufrufen ohne Paketnamen standardmäßig nur installierte Pakete enthält sind aufgelistet.
$ dpkg-query -f "${Package}\n" -W |grep "linux-image" #-W == --show
Kommentare
- " Fügen Sie
|awk -F'/' 'NR>1{print $1}'
zum Befehl apt list hinzu. " ist die kürzeste Antwort für " Nur Namen von apt-Listen "
Antwort
Hier ist ein guter Weg zu Holen Sie sich die Liste von in blockierte Pakete auf einem Debian-basierten System:
dpkg -l | grep ^ii | awk "{print $2}"
Den Ausgabezeilen von dpkg -l
kann vertraut werden, dass sie vernünftig sind . Das Muster ^ii
stimmt mit den Zeilen der installierten Pakete überein, und das einfache Awk extrahiert die zweite Spalte, die Paketnamen (dieselben Namen wie in apt-get install
Befehle). Paketnamen dürfen keine Leerzeichen enthalten, daher ist dies wiederum ein sicherer Vorgang.
Kommentare
- Dies funktioniert, wenn Sie nach Version suchen möchten. Die Antworten mit
aptitude search
undapt list
lauten in diesem Fall nicht ' t.
Antwort
Um den gesuchten Begriff zu „fangen“, wenn grep ping dpkg output, muss den Suchbegriff wie folgt einschließen. „ git “ wird als Probensuchbegriff verwendet:
dpkg -l |grep "^ii git[[:space:]]"
Die Karat (^) ii gefolgt von (2) Leerzeichen vor dem gesuchten Begriff stellt sicher, dass nichts VOR kann eine andere als diese Zeichenkombination übereinstimmen.
Die [[:space:]]
grenzt an den gesuchten Begriff verhindert, dass Teilübereinstimmungen auftreten, indem nur Leerzeichen sofort NACH it.
übereinstimmen