Du suchst ein Programm für einen bestimmten Zweck?
-
michaa7
- Beiträge: 4917
- Registriert: 12.12.2004 00:46:49
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von michaa7 » 22.12.2022 21:08:01
In den vergangenen Tagen habe ich hier in verschiedenen Postings die '~i' option als Filter für die Ausgabe für "nur installierte Pakete" gesehen.
Ich habe nun versucht das mit "apt policy <paketname>" zu kombinieren um eben die Ausgabe auf hier installierte Pakete zu beschränken. Das wäre besonders bei Kernel Images schön, weil da die Paketversion nicht zwingend die Kernelversion wiederspielgelt. Es mag aber natürlich auch andere Anwendungsfälle geben.
Ich habe versucht:
Da werden alle verfügbaren linux images gelistet, installiert oder nicht.
Das führt zu etwas vollkommen unvorhergesehenem: Da werden alle installierten Pakete, nicht nur linux-images gelistet.
Läßt sich ~i-Filter irgendwie so einsetzen dass das gewünschte dabei herauskommt?
Zuletzt geändert von
michaa7 am 23.12.2022 20:53:17, insgesamt 1-mal geändert.
gruß
michaa7
-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)
-
JTH
- Moderator
- Beiträge: 3077
- Registriert: 13.08.2008 17:01:41
- Wohnort: Berlin
Beitrag
von JTH » 22.12.2022 21:52:09
Hab jetzt nicht ausprobiert, ob die Filter auch bei
apt policy funktionieren.
Aber grundsätzlich: Damit beide oder alle Bedingungen durch die Ergebnisse erfüllt sein müssen, muss man das Ganze, wie in tobos Antwort, in einem Stringargument übergeben:
Siehe
man apt-patterns.
Edit: Korrigiere, wenn man so ein Suchmuster wie ~i mit einem Namen mit Platzhalter kombinieren will, muss man das bei apt (ohne -itude) anscheinend etwas länger formulieren:
Auf ~n folgt ein RegEx, der den/die gesuchten Namen matchen sollte.
Zuletzt geändert von
JTH am 22.12.2022 22:27:37, insgesamt 1-mal geändert.
Manchmal bekannt als Just (another) Terminal Hacker.
-
michaa7
- Beiträge: 4917
- Registriert: 12.12.2004 00:46:49
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von michaa7 » 23.12.2022 10:14:06
Super, danke.
Auch für den Tipp mit "man apt-patterns". Das hatte ich nicht auf dem Schirm. Ich hatte bei man apt nach "~i" gesucht und nichts gefunden.
Fragen:
Das ^ bewirkt eigentlich nichts, ist das nur ein optischer Trenner in der Eingabe?
Läßt sich die Ausgabe so beeinflussen, dass jeweils eine Leerzeile nach einem angezeigten Treffer ausgegeben wird? Das ist so wie es ist schwer zu lesen.
gruß
michaa7
-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)
-
tobo
- Beiträge: 2336
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 23.12.2022 10:38:36
michaa7 hat geschrieben: 23.12.2022 10:14:06
Das ^ bewirkt eigentlich nichts, ist das nur ein optischer Trenner in der Eingabe?
Wie schon von JTH gesagt wurde, gehört das zur RegEx. Schau dir mal den Unterschied (mit/ohne ^) hier an:
-
JTH
- Moderator
- Beiträge: 3077
- Registriert: 13.08.2008 17:01:41
- Wohnort: Berlin
Beitrag
von JTH » 23.12.2022 12:12:50
michaa7 hat geschrieben: 23.12.2022 10:14:06
Läßt sich die Ausgabe so beeinflussen, dass jeweils eine Leerzeile nach einem angezeigten Treffer ausgegeben wird? Das ist so wie es ist schwer zu lesen.
Die apt-policy-Ausgabe lässt sich mein ich nicht verändern, nein. Aber es gibt etliche Helferlein, mit denen du das erreichen könntest
Code: Alles auswählen
apt-cache policy '~i ~n^linux-image-' | sed '2,$s#^[[:graph:]]*:$#\n\0#'
Hier mit
apt-cache policy, da
apt ja ungern in Skripten benutzt werden möchte.
Zuletzt geändert von
JTH am 23.12.2022 14:52:26, insgesamt 1-mal geändert.
Grund: Überflüssige Umleitung `2>/dev/null` entfernt
Manchmal bekannt als Just (another) Terminal Hacker.
-
michaa7
- Beiträge: 4917
- Registriert: 12.12.2004 00:46:49
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von michaa7 » 23.12.2022 14:34:58
tobo hat geschrieben: 23.12.2022 10:38:36
michaa7 hat geschrieben: 23.12.2022 10:14:06
Das ^ bewirkt eigentlich nichts, ist das nur ein optischer Trenner in der Eingabe?
Wie schon von JTH gesagt wurde, gehört das zur RegEx. Schau dir mal den Unterschied (mit/ohne ^) hier an:
Ok, verstanden, ist ne wildcard. Danke.
gruß
michaa7
-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)
-
michaa7
- Beiträge: 4917
- Registriert: 12.12.2004 00:46:49
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von michaa7 » 23.12.2022 14:41:14
JTH hat geschrieben: 23.12.2022 12:12:50
...
Code: Alles auswählen
apt-cache policy '~i ~n^linux-image-' 2>/dev/null | sed '2,$s#^[[:graph:]]*:$#\n\0#'
Hier mit
apt-cache policy, da
apt ja ungern in Skripten benutzt werden möchte.
Schaut viel übersichtlicher aus. Code ist natürlich ein Ungetüm, für Normalsterbliche die da durchsteigen wollen mindestens eine WE Beschäftigung, falls die Geduld und der Ehrgeiz ausreicht.
Ich werde mir das in ein Alias packen.
Und mal schaun, vielleicht file ich da auch nen wishbug. Eigentlich ist doch völlig offensichtlich dass so eine Leerzeilenoption notwendig ist, ohne ist das ja fast Kauderwelsch.
Danke.
gruß
michaa7
-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)
-
tobo
- Beiträge: 2336
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 23.12.2022 16:53:41
michaa7 hat geschrieben: 23.12.2022 14:34:58
Ok, verstanden, ist ne wildcard. Danke.
Ne, ist keine Wildcard. Eine Wildcard ist ein Platzhalter für etwas anderes. Der Joker ist im Kartenspiel eine Wildcard - man kann ihn als Ersetzung für jede andere Karte einsetzen. Der . wäre in einer RegEx eine Wildcard - er steht dort als Platzhalter für ein anderes Zeichen. Das ^ steht gerade nicht für ein anderes Zeichen, sondern markiert den Anfang der Zeichenkette. "^linux" findet Pakete, die mit linux beginnen und "linux" findet Pakete, bei denen linux irgendwo im Namen auftaucht.
EDIT:
Ich werde mir das in ein Alias packen.
Besser in eine Funktion. Das hat unter anderem den Vorteil, dass ddu die RegEx als Parameter übergeben und damit variabel gestalten kannst:
Code: Alles auswählen
$ f(){ apt-cache policy "~i ~n$1" 2>/dev/null | sed '2,$s#^[[:graph:]]*:$#\n\0#'; }
$ f "^ut.*x$"
util-linux:
Installed: 2.36.1-8+deb11u1
Candidate: 2.36.1-8+deb11u1
Version table:
*** 2.36.1-8+deb11u1 500
500 https://debian.inf.tu-dresden.de/debian bullseye/main amd64 Packages
500 https://debian.inf.tu-dresden.de/debian-security bullseye-security/main amd64 Packages
100 /var/lib/dpkg/status
-
michaa7
- Beiträge: 4917
- Registriert: 12.12.2004 00:46:49
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von michaa7 » 23.12.2022 19:02:00
tobo hat geschrieben: 23.12.2022 16:53:41
...Das ^ steht gerade nicht für ein anderes Zeichen, sondern markiert den Anfang der Zeichenkette. "^linux" findet Pakete, die mit linux beginnen und "linux" findet Pakete, bei denen linux irgendwo im Namen auftaucht.
Maaaaaan, wieder schnell hingeschaut und deshalb missverstanden. Ich hatte mich schon gefragt warum es zwei "joker" gibt. Es verhält sich eben genau umgekehrt.
Danke für die Klarstellung.
tobo hat geschrieben: 23.12.2022 16:53:41
Besser in eine Funktion. Das hat unter anderem den Vorteil, dass ddu die RegEx als Parameter übergeben und damit variabel gestalten kannst:
Code: Alles auswählen
$ f(){ apt-cache policy "~i ~n$1" 2>/dev/null | sed '2,$s#^[[:graph:]]*:$#\n\0#'; }
$ f "^ut.*x$"
util-linux:
Installed: 2.36.1-8+deb11u1
Candidate: 2.36.1-8+deb11u1
Version table:
*** 2.36.1-8+deb11u1 500
500 https://debian.inf.tu-dresden.de/debian bullseye/main amd64 Packages
500 https://debian.inf.tu-dresden.de/debian-security bullseye-security/main amd64 Packages
100 /var/lib/dpkg/status
Super. Habe es ausprobiert. Damit kann man ja sogar noch das gewünschte Ende des Strings filtern. Danke!
Dass es Funktionen gibt wußte ich gar nicht (naja, nicht dass ich sonst tief in der Materie steckte, aber aliase kannte ich ja schon ..). Wo kann ich mehr darüber lesen. Unter "man function(s)" finde ich nichts.
Danke.
gruß
michaa7
-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)
-
JTH
- Moderator
- Beiträge: 3077
- Registriert: 13.08.2008 17:01:41
- Wohnort: Berlin
Beitrag
von JTH » 23.12.2022 19:18:34
Ich korrigier nochmal meine Urversion von oben, die Umleitung
2>/dev/null kann sollte man weglassen, um Eingabefehler nicht zu verstecken. Die wäre nur hilfreich gewesen, wenn man dort
apt, statt
apt-cache benutzen würde. Also dies reicht:
Code: Alles auswählen
pretty_policy(){ apt-cache policy "~i ~n$1" | sed '2,$s#^[[:graph:]]*:$#\n\0#'; }
michaa7 hat geschrieben: 23.12.2022 19:02:00
Wo kann ich mehr darüber lesen. Unter "man function(s)" finde ich nichts.
Als Referenz hilft mir immer
man bash (siehe
FUNCTIONS dort), zum Einsteigen wahrscheinlich eher nicht. Dazu fand ich früher die Guides von tldp.org hilfreich:
Ansonsten findest du zu „Linux Shell Functions“ garantiert unzählige Quellen im Netz
Manchmal bekannt als Just (another) Terminal Hacker.
-
michaa7
- Beiträge: 4917
- Registriert: 12.12.2004 00:46:49
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von michaa7 » 23.12.2022 20:52:57
So ... für alle die das sonst noch interessiert:
Ich habe das nun im user- und root-home in die .bashrc eingetragen (damit diese Funktion wie das ja auch bei aliasen ist beim nächsten boot wieder verfügbar ist), "f" aus dem Beispiel mit einem passenden Namen ersetzt (apts für apt Suche/Search) und einen Kommentar damit ich hier eine Erinnerung für alle Fälle habe.
Code: Alles auswählen
# Funktion zum Suchen installierter Pakete
# ausführen mit 'apts "^Muster"', "^" erzwingt Anfang
apts(){ apt-cache policy "~i ~n$1" 2>/dev/null | sed '2,$s#^[[:graph:]]*:$#\n\0#'; }
Das Thema ist damit für heute gegessen.
Danke an alle!
gruß
michaa7
-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)