Script "liste der installierten Pakete" eleganter machen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
whisper
Beiträge: 3193
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Script "liste der installierten Pakete" eleganter machen

Beitrag von whisper » 11.03.2024 15:51:06

Ahoi!
ich habe ein Script welches mir alle in letzter Zeit installierten Pakete mit Datum ausgibt.
Das ist nützlich, wenn man wieder mal ein Paketnamen vergessen hat, obwohl es vor kurzem installiert worden sit.

Code: Alles auswählen

# cat installed.sh 
#!/bin/bash
echo "== Installierte Pakete =="

SUMPAC="$(zgrep -hsB1 "Commandline: apt install" /var/log/apt/history.log* 2>/dev/null|sed 's/Commandline: apt install //')"
echo "$SUMPAC" | sed '/^--$/d' | sed 's/Start-Date://' | awk 'BEGIN {ORS=" "} {if (NR%2==0) print "\t" $0 "\n"; else printf "%s", $0}'
Beispielausgabe:
# ./installed.sh
== Installierte Pakete ==
2024-03-04 18:34:50 tuxedo-control-center
2024-03-04 19:30:00 gnome-video-trimmer
2024-03-10 19:51:28 openshot-qt
2023-05-03 12:35:55 menulibre
2023-05-04 17:58:55 simplescreenrecorder/testing
2023-05-05 21:12:35 wine
2023-05-05 21:15:54 mono-complete
2023-05-05 21:18:58 winetricks
2023-05-08 12:21:17 geany-plugin-prettyprinter
2023-05-08 13:36:08 tidy
Wer hat Ideen und macht das Script eleganter; höher; weiter;

Benutzeravatar
GregorS
Beiträge: 2629
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von GregorS » 11.03.2024 17:49:53

Wenn ich scripte, achte ich zuallererst auf Übersichtlichkeit/Lesbarkeit. D.h. ich versuche, die Länge von Zeilen auf 80 Zeichen zu beschränken. Die elends-lange Pipe würde ich jeweils nach dem Pipe-Zeichen umbrechen (Backslash nicht vergessen). So wäre sie IMO hübscher. Wie man das mit der darüber stehenden Zeile anstellen könnte, ist mir aus dem Stegreif allerdings schleierhaft.

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

tobo
Beiträge: 1997
Registriert: 10.12.2008 10:51:41

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von tobo » 11.03.2024 18:00:26

Ich würde definitiv nicht sed "und" awk zusammen benutzen. Vielleicht sowas als Ausgangspunkt:

Code: Alles auswählen

zgrep -hsB1 install /var/log/apt/history.log* | sed -E '/^--$/d; N; s/\n//; s/  / /; s/Start-Date: |Commandline: apt(-get)? install//g'
Bleiben aber z.B. noch solche Sachen wie `apt-get --reinstall install ...' oder `apt-get install --reinstall ...' oder `apt -o DPkg::options ...' übrig.

EDIT:
Das würde bei mir schon ausreichend funktionieren:

Code: Alles auswählen

zgrep -hsB1 "\binstall\b" /var/log/apt/history.log* | sed -E '/^--$/d; N; s/\n//; s/  / /; s/Start-Date: |Commandline: apt(-get)?| +install| +--reinstall//g'
EDIT: Leerzeichen ergänzt
Zuletzt geändert von tobo am 11.03.2024 20:51:59, insgesamt 1-mal geändert.

Benutzeravatar
whisper
Beiträge: 3193
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von whisper » 11.03.2024 19:41:41

@tobo,
der Einzeiler von dir hat schon seinen Reiz, aber so geht es nicht allein, denn so kommen auch auch artefakte aus upgrades o.ä.
# zgrep -hsB1 "\binstall\b" /var/log/apt/history.log* | sed -E '/^--$/d; N; s/\n//; s/ //; s/Start-Date: |Commandline: apt(-get)?| +install| +--reinstall//g'
2024-03-0418:34:50 tuxedo-control-center
2024-03-0419:30:00 gnome-video-trimmer
2024-03-0917:19:26 -o APT::Status-Fd=4 -o APT::Keep-Fds::=5 -o APT::Keep-Fds::=6 -q -y -o APT::Install-Recommends=true -o APT::Get::AutomaticRemove=true -o Acquire::Retries=3 task-cinnamon-desktop task-mate-desktop
Install: libsub-exporter-perl:amd64 (0.990-1, automatic), lintian:amd64 (2.117.0, automatic), libxapp1:amd64 (2.8.2-1, automatic), pluma-common:amd64 (1.26.1-2, automatic), libhtml-tokeparser-simple-perl:amd64 (3.16-4, automatic), muffin:amd64 (5.8.1-2+b1, automatic), gir1.2-cmenu-3.0:amd64 (6.0.0-1+b1, automatic), libcaribou0:amd64 (0.4.21-8+b1, automatic), cinnamon-screensaver:amd64 (5.8.1-3, automatic),
Mein Ziel ist, nur die von mir installierten Pakete auszugeben.

Allerdings ist die Zusammenfassung der sed Ausdrücke doch schon ein Fortschritt.
Na, wenn ich die Tage dazu komme versuche ichs mal.
Benutzbar ist ja bereits.

So sieht z.B. eine Verwendung bei mir aus
# ./installed.sh |grep top
2023-03-26 10:53:01 nextcloud-desktop-l10n
2023-03-26 10:53:39 nextcloud-desktop
2024-02-04 10:27:39 atop
2023-12-09 08:39:08 signal-desktop
2023-12-23 12:59:09 usbtop
2023-10-02 11:03:53 bpytop
2023-06-06 16:36:17 btop
Danke euch bis dahin

tobo
Beiträge: 1997
Registriert: 10.12.2008 10:51:41

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von tobo » 11.03.2024 21:32:32

whisper hat geschrieben: ↑ zum Beitrag ↑
11.03.2024 19:41:41
@tobo,
der Einzeiler von dir hat schon seinen Reiz, aber so geht es nicht allein, denn so kommen auch auch artefakte aus upgrades o.ä.

Code: Alles auswählen

# zgrep -hsB1 "\binstall\b" /var/log/apt/history.log* | sed -E '/^--$/d; N; s/\n//; s/  //; s/Start-Date: |Commandline: apt(-get)?| +install| +--reinstall//g'
2024-03-0418:34:50 tuxedo-control-center
2024-03-0419:30:00 gnome-video-trimmer
2024-03-0917:19:26 -o APT::Status-Fd=4 -o APT::Keep-Fds::=5 -o APT::Keep-Fds::=6 -q -y -o APT::Install-Recommends=true -o APT::Get::AutomaticRemove=true -o Acquire::Retries=3 task-cinnamon-desktop task-mate-desktop
Install: libsub-exporter-perl:amd64 (0.990-1, automatic), lintian:amd64 (2.117.0, automatic), libxapp1:amd64 (2.8.2-1, automatic), pluma-common:amd64 (1.26.1-2, automatic), libhtml-tokeparser-simple-perl:amd64 (3.16-4, automatic), muffin:amd64 (5.8.1-2+b1, automatic), gir1.2-cmenu-3.0:amd64 (6.0.0-1+b1, automatic), libcaribou0:amd64 (0.4.21-8+b1, automatic), cinnamon-screensaver:amd64 (5.8.1-3, automatic),
Ich habe oben noch ein Leerzeichen zwischen Datum und Uhrzeit nachgetragen. Was ich nicht verstehe, ist, wie die unteren Zeilen bei dir durch "\binstall\b" gefunden werden können!? Man müsste das Rohmaterial zu diesen Zeilen sehen (ohne das sed).

Benutzeravatar
whisper
Beiträge: 3193
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von whisper » 12.03.2024 09:30:42

Jo,
das kommt vermutlich durch tasksel task-cinnamon-desktop task-mate-desktop

Code: Alles auswählen

zgrep "Status-Fd=4" /var/log/apt/history.log
Commandline: apt-get -o APT::Status-Fd=4 -o APT::Keep-Fds::=5 -o APT::Keep-Fds::=6 -q -y -o APT::Install-Recommends=true -o APT::Get::AutomaticRemove=true -o Acquire::Retries=3 install task-cinnamon-desktop task-mate-desktop


root@debian-bookworm:~# zgrep -B1 -A1 "Status-Fd=4" /var/log/apt/history.log
Start-Date: 2024-03-09  17:19:26
Commandline: apt-get -o APT::Status-Fd=4 -o APT::Keep-Fds::=5 -o APT::Keep-Fds::=6 -q -y -o APT::Install-Recommends=true -o APT::Get::AutomaticRemove=true -o Acquire::Retries=3 install task-cinnamon-desktop task-mate-desktop

Benutzeravatar
whisper
Beiträge: 3193
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von whisper » 12.03.2024 09:58:56

huch, wo ist denn der Beitrag von "inne" ?
Hatte eine längere Antwort geschrieben, absenden ging in die Hose .. :cry:

tobo
Beiträge: 1997
Registriert: 10.12.2008 10:51:41

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von tobo » 12.03.2024 10:12:25

Ok, hatte komplett übersehen, dass du ja direkt nach "apt install" aussortierst. Das wäre dann mit sed, für apt/apt-get inklusive reinstall:

Code: Alles auswählen

zgrep -EhsB1 "apt(-get)? ((--)?re)?install" /var/log/apt/history.log* | sed -E '/^--$/d; N; s/\n//; s/  / /; s/Start-Date: |Commandline: apt(-get)?| (--)?(re)?install//g'
Aptitude könnte man da auch noch aufnehmen - das schreibt "incognito" ins Log und die Pakete ein bisschen anders.

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von inne » 12.03.2024 14:29:53

whisper hat geschrieben: ↑ zum Beitrag ↑
12.03.2024 09:58:56
Hatte eine längere Antwort geschrieben, absenden ging in die Hose .. :cry:
Das tut mir leid! Aber meine Lösung hatte/hat ein paar Fehler, weswegen ich sie wieder gelöscht hatte.

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von inne » 12.03.2024 14:52:20

Ich weiss nun wo MEIN Fehler lag apt vs. apt-get :facepalm: :roll:

Code: Alles auswählen

#!/bin/bash
(cat /var/log/apt/history.log; zcat /var/log/apt/history.log.*.gz) | gawk '
BEGIN {print "== Installierte Pakete =="}
/Start-Date: / {d=sprintf("%s %s", $2, $3);p=0}
/Commandline: apt install/{ p=1;}
/Commandline: apt-get install/{ p=1;}
/Install: / {$1=""; i=$0}
/End-Date: /{
        if(p) {
                printf("%s %s\n", d, i);
        }
        p=0;
}
'
Weiss aber nicht wirklich, ob ich das Logformat richtig behandle.
Da könnte mal jemand allgemein was dazu sagen. @meillo?

Benutzeravatar
whisper
Beiträge: 3193
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von whisper » 12.03.2024 16:37:02

Inne,
okay :D
Jetzt ist die Frage welches Konzept nun das bessere ist.
Deine Lösung ist wesentlich schneller, aber bei eine Laufzeit unter einer Sekunde ist das nur akademisch.
Deine Lösung zeigt ja auch die mit installierten Pakete, meins nur die zu Fuß installierten.

Man könnte nun über beide Varianten einen Debianzenity oder DebianDialog Wrapper bauen.
Vielleicht optional auswählbar eins der beiden Scripte nutzen.
Ist die Frage... braucht man das?
Glaube eher nicht.
Auf jeden Fall werde ich beide Varianten etwas mit Beschreibungen versehen und in meinem privaten CVS bunkern.
:THX:

Benutzeravatar
GregorS
Beiträge: 2629
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von GregorS » 12.03.2024 16:59:55

whisper hat geschrieben: ↑ zum Beitrag ↑
12.03.2024 16:37:02
Ist die Frage... braucht man das?
Ja. Der Unterschied wäre zumindest für mich interessant (wenn vielleicht auch eher von akademischem Wert).
Auf jeden Fall werde ich beide Varianten etwas mit Beschreibungen versehen und in meinem privaten CVS bunkern.
Poste sie bitte auch hier. Ich bin sehr interessiert.

Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von inne » 12.03.2024 17:02:03

Hallo whisper,

kommt natürlich drauf was und wozu man es haben will:

Im Wiki von Siduction, hatte sie noch diese Lösung (die ist aber wohl nur noch auf archive.org usw. zu bekommen):

apt-hist:

Code: Alles auswählen

#!/usr/bin/env bash
#
# Variablenbelegung
APT_LOG_PATH="/var/log/apt"
APT_LOG_FILE="history.log"
STRING_START_DATE="Start-Date:"
STRING_CMD_LINE="Commandline:"

# Funktionsdefinitionen
init_array()
{
	IFS=#
	ROW=""
	INDEX_APTHIST=""
}

# Hauptprogramm

# Array initialisieren
init_array

# Datum und Zeit der Installation ermitteln und ins Array schreiben
while read ROW
	do
	TMP1=`echo $ROW | egrep $STRING_START_DATE`
	if [ "$TMP1" ]
		then
		START_DATE=`echo $TMP1 | awk '{print $2,$3}'`
		CMD_LINE=`echo $TMP2 | awk '{print $2,$3}'`
		ARRAY_APTHIST[$INDEX_APTHIST]=$START_DATE
		INDEX_APTHIST=`expr $INDEX_APTHIST + 1`
	fi
done < $APT_LOG_PATH/$APT_LOG_FILE

# Array initialisieren
init_array

# Befehle ermitteln und ins Array schreiben
while read ROW
	do
	TMP2=`echo $ROW | egrep $STRING_CMD_LINE`
	if [ "$TMP2" ]
		then
		CMD_LINE=`echo ${TMP2#$STRING_CMD_LINE }`
		ARRAY_APTHIST[$INDEX_APTHIST]=${ARRAY_APTHIST[$INDEX_APTHIST]}";"$CMD_LINE
		INDEX_APTHIST=`expr $INDEX_APTHIST + 1`
	fi
done < $APT_LOG_PATH/$APT_LOG_FILE

init_array
# Formatierte Ausgabe
for ROW in  ${ARRAY_APTHIST[@]}
	do
	echo $ROW | awk -F";" '{printf("%s%s%s  %s\n","[",$1,"]",$2,"]")}'
done

#EOF

Benutzeravatar
whisper
Beiträge: 3193
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Script "liste der installierten Pakete" eleganter machen

Beitrag von whisper » 12.03.2024 20:13:31

Hier mal ein Ansatz mit whiptail

Code: Alles auswählen

#!/bin/bash
clear
bold=$(tput bold)
normal=$(tput sgr0)
gruen=$(tput setaf 2)
rot=$(tput setaf 1)
black=$(tput setaf 0)

whiptail_eingabe=$(whiptail --title "Suche nach Installationsdatum" --backtitle="Suche nach Installationsdatum eines oder mehrerer Pakete" --inputbox "Suchstring"  10 50 3>&1 1>&2 2>&3)
echo "$bold=== Installierdatum    $rot Pakete$normal$bold ===$normal"
SUMPAC="$(zgrep -hsB1 "Commandline: apt install" /var/log/apt/history.log* 2>/dev/null|sed 's/Commandline: apt install //')"
echo "$SUMPAC" | sed '/^--$/d' | sed 's/Start-Date://' | awk 'BEGIN {ORS=" "} {if (NR%2==0) print "\t" $0 "\n"; else printf "%s", $0}'|grep -i --color "$whiptail_eingabe"


Antworten