Richtiger Weg, um die Liste der installierten Pakete zu erhalten, die einem Muster entsprechen?

11

Ich bin auf einem System, auf dem eine (relativ neue) Debian-basierte Distribution ausgeführt wird.

Ich möchte eine einfache Liste aller installierten Pakete erstellen, die einem bestimmten Muster entsprechen. Ich kann das tun, indem ich renne, sagen wir,

apt list --installed "linux-image-*" | cut -d/ -f1

aber ich bekomme Zeilen, die mir egal sind, zB:

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Listing...

Also vielleicht besser nicht verwenden apt. Ich kann dpkg-query wie folgt ausführen:

dpkg-query --showformat='${Package}\n' --show "linux-image*"

Dies ist jedoch nicht auf installierte Pakete beschränkt. ich könnte benutzen

dpkg-query --list "linux-image-*" | grep "ii"

aber dann müsste ich ein paar Textverarbeitungen machen, und wer kann diesen Räumen vertrauen, oder?

Also, Fazit: Was ist der richtige Weg , um die Liste der installierten Pakete passend ein Muster zu bekommen?


Hinweis :

  • Bonuspunkte, wenn es sich nicht nur um einen Shell Glob, sondern um einen richtigen regulären Ausdruck handeln kann.
  • Den Text analysieren zu müssen, scheint eine weniger als ideale Lösung zu sein. Wenn Sie dies vorschlagen, argumentieren Sie bitte, warum es keinen besseren Weg gibt.
einpoklum
quelle

Antworten:

8

aptitude unterstützt die Suche in allen Paketen, die den installierten oder anderweitig installierten Paketverwaltungs-Tools bekannt sind, unter Verwendung regulärer Ausdrücke ohne fremde Ausgabe, und es kann erklärt werden, wie die Ausgabe formatiert wird:

aptitude search "linux-image-.*"

So listen Sie nur installierte Pakete auf:

aptitude search "linux-image-.* ~i"

So listen Sie nur installierte Paketnamen auf , die dem regulären Ausdruck entsprechen:

aptitude search "linux-image-.* ~i" -F "%p"

Die Dokumentation behandelt die verfügbaren Suchmuster und Ausgabeformatspezifizierer im Detail. Auf dieser Website finden Sie auch Beispiele. Gibt es beispielsweise eine Möglichkeit, Regexp mit Eignung zu verwenden? , regexp mit aptitude part 2 und Linux - Sicherheitsupdates nur mit apt anzeigen oder aktualisieren .

Stephen Kitt
quelle
5

Hier ist eine gute Möglichkeit, die Liste der installierten Pakete auf einem Debian-basierten System abzurufen:

dpkg -l | grep ^ii | awk '{print $2}'

Man dpkg -lkann sich darauf verlassen, dass die Ausgabezeilen von vernünftig sind. Das Muster ^iistimmt mit den Zeilen der installierten Pakete überein, und das einfache Awk extrahiert die zweite Spalte, die Paketnamen (dieselben Namen, die in apt-get installBefehlen verwendet werden). Paketnamen dürfen keine Leerzeichen enthalten, daher ist dies wiederum eine sichere Operation.

Janos
quelle
5
$ 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 auch verwenden , dpkg-querymit -f(--showformat) Option, die , wenn sie ohne Paketnamen aufgerufen wird , werden standardmäßig nur installierten Pakete aufgelistet.

$ dpkg-query -f '${Package}\n' -W |grep 'linux-image' #-W == --show
George Vasiliou
quelle
1

Um den gesuchten Begriff bei der Ausgabe von grep ping dpkg zu "fangen" , muss der Suchbegriff wie folgt eingeschlossen werden. " git " wird als Probensuchbegriff verwendet:

dpkg -l |grep "^ii  git[[:space:]]"

Das Karat (^) ii gefolgt von (2) Leerzeichen vor dem gesuchten Begriff stellt sicher, dass nichts VOR dieser Kombination von Zeichen übereinstimmt.

Das [[:space:]]Aneinanderreihen des gesuchten Begriffs verhindert, dass Teilübereinstimmungen auftreten, indem nur unmittelbar danach Leerzeichen abgeglichen werden .

F1Linux
quelle