Auswertung von inst. Programmen

I

iceman99

Jungspund
Hallo,
ich bastele mir gerade ein Shell-Script, das die Ausgabe von "rpm-qa > sw-version.list" in folgende Variante bringen soll:

Programmname:
Version:
Patchlevel:

Ich stosse immer wieder auf das Problem mit der unterschiedlichen Anzahl von "-" in den Dateinamen.

Hat jemand von euch eine Lösung?
 
Wie sieht denn die Ausgabe von "rpm-qa > sw-version.list" aus?

Gruss, Xanti
 
Das ist ein Ausschnitt aus der Liste:

gpg-pubkey-9c800aca-40d8063e
filesystem-9-29.4
providers-2004.4.2-4.1
aaa_skel-2004.6.8-0.2
sash-3.7-28.1
popt-1.7-176.7
zlib-1.2.1-70.1
schedutils-1.3.5-0.1
mingetty-0.9.6s-73.1
expat-1.95.7-37.1
libattr-2.4.12-56.1
eject-2.0.13-185.1
prctl-1.3-353.1
iptables-1.2.9-95.6
libaio-0.3.98-18.3
hdparm-5.5-41.3
utempter-0.5.2-385.4
lsof-4.70-30.1
patch-2.5.9-141.1
pcre-4.4-109.1
lukemftp-1.5-578.1
file-4.07-48.5
db-4.2.52-86.3
libjpeg-6.2.0-731.1
module-init-tools-3.0_pre10-37.16
cracklib-2.7-1006.1

Gerade die vorletzte Datei mit den mehreren "-" im Dateinamen...
 
Auf die Schnelle:

Code:
for i in $(rpm-qa)
do
  echo $i | perl -p -e 's/(.*)-([^-]*)-([^-]*)$/Programmname: $1\nVersion: $2\nPatchlevel: $3/'
done

Es gibt aber bestimmt elegantere Lösungen.

Gruss, Xanti
 
Zuletzt bearbeitet:
Funktioniert doch gut.
Ich bin begeistert. Werde mich doch mal intensiver mit Perl beschäftigen müssen. Mein Ansatz war mit sed.
 
Mit sed oder awk geht es bestimmt auch, leider kenn ich mich da nicht so aus.

Gruss, Xanti

edit: Wenn rpm-qa die Listenelemente mit "\n" trennt (was es offensichtlich auch tut), sollte es auch ohne Schleife gehen

Code:
rpm-qa | perl -p -e 's/(.*)-([^-]*)-([^-]*)$/Programmname: $1\nVersion: $2\nPatchlevel: $3/'
 
Zuletzt bearbeitet:
Hast recht. Funktioniert auch ohne Schleife.

Wenn ich mal fragen darf, ob Du noch eine Perl-Lösung für das gleich Problem unter Debian hast.
Der Aufruf des Paketmanagers ist dpkg -l und der Output fängt mit so an:

Gewünscht=Unbekannt/Installieren/R=Entfernen/P=Säubern/Halten
| Status=Nicht/Installiert/Config/U=Entpackt/Fehlgeschl. Konf./Halb install.
|/Fehler?=(keiner)/Halten/R=Neuinst.notw/X=beides (Status,Fehler: GROSS=schlecht)
||/ Name Version Beschreibung
+++-==============-==============-============================================
ii mozilla 1.0.0-1 Mozilla Web Browser - dummy package
ii mozilla-browse 1.0.0-1 Mozilla Web Browser - core and browser
rc mozilla-browse 0.0.20020226.1 An Open Source WWW browser for X and GTK+ (C
ii mozilla-browse 0.0.20020610.0 An Open Source WWW browser for X and GTK+ (C
ii mozilla-chatzi 1.0.0-1 Mozilla Web Browser - irc client
pn mozilla-chatzi <keine> (keine Beschreibung vorhanden)
pn mozilla-chatzi <keine> (keine Beschreibung vorhanden)
pn mozilla-cvs <keine> (keine Beschreibung vorhanden)
pn mozilla-cvs-de <keine> (keine Beschreibung vorhanden)
ii mozilla-dev 1.0.0-1 Mozilla Web Browser - development files
un mozilla-dmotif <keine> (keine Beschreibung vorhanden)
ii mozilla-dom-in 1.0.0-1 A tool for inspecting the DOM of pages in Mo
ii mozilla-dom-in 0.0.20020610.0 A tool for inspecting the DOM of pages in Mo
ii mozilla-js-deb 1.0.0-1 JavaScript debugger for use with Mozilla
pn mozilla-js-deb <keine> (keine Beschreibung vorhanden)
rc mozilla-locale 0.9.9-3 Mozilla German Language/Region Package.
pn mozilla-locale <keine> (keine Beschreibung vorhanden)
pn mozilla-locale <keine> (keine Beschreibung vorhanden)
ii mozilla-mailne 1.0.0-1 Mozilla Web Browser - mail and news support

Der Kopf besteht aus 5 Zeieln. Wird aber nicht benötigt.
Ich brauche nur jeweis Name (2.Spalte) und Version (3.Spalte).
Parallel bastele ich jetzt noch mit sed herum.

Danke schon einmal.
 
Code:
dpkg -l | perl -an -e 'BEGIN {$i=0} print "Programmname: $F[1]\nVersion: $F[2]\n" if $i++>4'

Gruss, Xanti
 
Ich habe das so gelöst:
Hast Du eine bessere Idee?
Zu testzwecken eine kleine Tabelle mit gleichem Aufbau in tabelle.test gelegt.

grep '^[ir]' tabelle.test | awk '{print "Name: " $2 } {print "Version: " $3'}
 
Xanti schrieb:
Code:
dpkg -l | perl -an -e 'BEGIN {$i=0} print "Programmname: $F[1]\nVersion: $F[2]\n" if $i++>4'

Gruss, Xanti

Das BEGIN und selbst Zählen, kann man sich sparen, wenn die zu übergehende Zeilenzahl konstant und bekannt ist. Hier 5
Code:
dpkg -l | perl -an -e 'print "Programmname: $F[1]\nVersion: $F[2]\n" unless (1..5)'
Oder wenn du nur die mit ir am Zeilenanfang willst:

Code:
dpkg -l | perl -an -e 'print "Programmname: $F[1]\nVersion: $F[2]\n" if (/^ir/)'
wenn du es schön formatiert haben willst, bietet sich auch printf an. ;)

Gruß Wolfgang
 
iceman99 schrieb:
Ich habe das so gelöst:
Hast Du eine bessere Idee?
Zu testzwecken eine kleine Tabelle mit gleichem Aufbau in tabelle.test gelegt.

grep '^[ir]' tabelle.test | awk '{print "Name: " $2 } {print "Version: " $3'}

Hallo
Wenn du es schon mit awk machen willst, kannst du dir das grep sparen:
alle mit ii am Anfang:
Code:
dpkg -l |awk '/^ii/{print "Name:    "$2"\nVersion: "$3; }'

Gruß Wolfgang
 
Hallo Leute,

rpm kann das selbst. Dein Problem ist keins, wo man awk, sed, perl etc bemühen müsste. Probier mal:

rpm -qa --queryformat 'Programmname: %{NAME}\nVersion: %{VERSION}\nPatchlevel: %{RELEASE}\n\n' > sw-version.list

alles bitte in einer Zeile ohne Zeilenumbruch.
Und macht Euch mal mit rpm vertraut. Das kann so einiges ;-)

Have fun.

phrenicus
 
phrenicus schrieb:
Hallo Leute,

rpm kann das selbst. Dein Problem ist keins, wo man awk, sed, perl etc bemühen müsste. Probier mal:

rpm -qa --queryformat 'Programmname: %{NAME}\nVersion: %{VERSION}\nPatchlevel: %{RELEASE}\n\n' > sw-version.list

alles bitte in einer Zeile ohne Zeilenumbruch.
Und macht Euch mal mit rpm vertraut. Das kann so einiges ;-)

Have fun.

phrenicus

Hallo
Hier ist aber nicht von rpm die Rede!
Das dpkg stammt aus der Debianwelt, wo rpm nicht zu Hause ist.

Gruß Wolfgang
 
Hallo,
das Script arbeitet mittlerweile sehr gut und auf verschiedensten Plattformen.

Trotzdem brauche ich nochmal Hilfe bei dem Umbau der Ausgaben. Diese sollen jetzt direkt in eine DB.

Ziel ist folgende Struktur:

update SoftwareListe set
ip = '192.168.99.1',
rechner = 'alice',
vlan = '',
os = 'SUSE 2.6.12.2',
ssh = 'openssh Version:3.8p1'
where host = 'alice.aon.arcor.net';
.....
Hier die weiteren Programmnamen

Zur Erinnerung:
Ausgangsliste 1 war:
gpg-pubkey-9c800aca-40d8063e
filesystem-9-29.4
providers-2004.4.2-4.1
aaa_skel-2004.6.8-0.2
sash-3.7-28.1
popt-1.7-176.7
zlib-1.2.1-70.1
schedutils-1.3.5-0.1
mingetty-0.9.6s-73.1
expat-1.95.7-37.1
libattr-2.4.12-56.1
eject-2.0.13-185.1
prctl-1.3-353.1
iptables-1.2.9-95.6
libaio-0.3.98-18.3
hdparm-5.5-41.3
utempter-0.5.2-385.4

Ausgangsliste 2 war:
Gewünscht=Unbekannt/Installieren/R=Entfernen/P=Säubern/Halten
| Status=Nicht/Installiert/Config/U=Entpackt/Fehlgeschl. Konf./Halb install.
|/Fehler?=(keiner)/Halten/R=Neuinst.notw/X=beides (Status,Fehler: GROSS=schlecht)
||/ Name Version Beschreibung
+++-==============-==============-============================================
ii mozilla 1.0.0-1 Mozilla Web Browser - dummy package
ii mozilla-browse 1.0.0-1 Mozilla Web Browser - core and browser
rc mozilla-browse 0.0.20020226.1 An Open Source WWW browser for X and GTK+ (C
ii mozilla-browse 0.0.20020610.0 An Open Source WWW browser for X and GTK+ (C
ii mozilla-chatzi 1.0.0-1 Mozilla Web Browser - irc client
pn mozilla-chatzi <keine> (keine Beschreibung vorhanden)
pn mozilla-chatzi <keine> (keine Beschreibung vorhanden)
pn mozilla-cvs <keine> (keine Beschreibung vorhanden)
pn mozilla-cvs-de <keine> (keine Beschreibung vorhanden)
ii mozilla-dev 1.0.0-1 Mozilla Web Browser - development files
 
Schreib

Code:
update SoftwareListe set
ip = '192.168.99.1',
rechner = 'alice',
vlan = '',
os = 'SUSE 2.6.12.2',
ssh = 'openssh Version:3.8p1'
where host = 'alice.aon.arcor.net';

in ein File (template) zum Beispiel und schalte jeweils ein cat template > ausgabe bei jedem subst-Befehl vor.

Gruss, Xanti
 
Hi,
so habe ich das auch gemacht. Das Problem, das ich habe, ist meine Schwäche in den regular expressions.
Da bin ich noch Anfänger. Zwar nicht mehr blutig, aber noch mit viel Problemen behaftet.
Wie muß ich diese Perl-Anweisungen umbauen, damit ich diese Ausgabe bekomme?

Kennst Du eine gute Webadresse, die sich verständlich damit befasst?

regarts
 
iceman99 schrieb:
Kennst Du eine gute Webadresse, die sich verständlich damit befasst?

regarts

In der Shell eingeben:

Code:
perldoc perlop

Oder halt nach reg exps googlen.

Wie soll denn das Ziel direkt aussehen? Deine Aufgabenstellung ist da nicht exakt genug. Was hast Du bereits selber versucht? Welche Fehlermeldungen kommen?

Da ich mittlerweile denke, dass Du dies alles für die Arbeit brauchst, möchte ich ein paar Bemühungen Deinerseits sehen. Wir sind schliesslich keine Skriptfabrik ;)

Gruss, Xanti
 
das geht auch ohne regexp's und zwar mit wenig Aufwand (perl). Man braucht nur etwas Logik.
 
Klar, bin zu der Sache mit der INventarisierung gekommen wie die Jungfrau zum Kind.
Du hilfst mir aber auch damit, die Sache mit den reg.exp. zu verstehen.
Die Ausgabe soll das Format aus dem letzten Eintrag haben. Das kann ich dann direkt in die DB schaufeln.

Hier mein Script:

#!/bin/bash
#
# Listengenerierung über Programmversionen (23.5.2006)
# rpm-based, debian-based und solaris-like

PACKETMGR=0

if [ -d /var/lib/rpm ]; then
PACKETMGR=rpm
else
if [ -d /var/lib/dpkg ]; then
PACKETMGR=deb
else
if [ -d /var/sadm ]; then
PACKETMGR=sol
else
PACKETMGR=bsd
fi
fi
fi

case "$PACKETMGR" in

rpm)
if [ -f sw-version.`uname -n`.list ]; then
rm sw-version.`uname -n`.list
fi
uname -nr | awk '{ print "Rechner:" $1} {print "Kernel:" $2 }' > sw-version.`uname -n`.list
ping -c 1 `uname -n` | head -n 1 | awk '{ print "Host:" $2} {print "IP:" $3 }' | sed 's/(//' | sed 's/)//'>>
sw-version.`uname -n`.list
rpm -qa | grep -f prog.list | perl -p -e 's/(.*)\-([^-]*?)\-([^-]*?)$/Programname:$1 Version:$2 Patchlevel:$3/
' >> sw-version.`uname -n`.list
;;

deb)
if [ -f sw-version.`uname -n`.list ]; then
rm sw-version.`uname -n`.list
fi
uname -nr | awk '{ print "Rechner:" $1} {print "Kernel:" $2 }' > sw-version.`uname -n`.list
ping -c 1 `uname -n` | head -n 1 | awk '{ print "Host:" $2} {print "IP:" $3 }' | sed 's/(//' | sed 's/)//'>>
sw-version.`uname -n`.list

dpkg -l | grep '^[ir]' tabelle.test | awk '{print "Programname: " $2 } {print "Version: " $3 }' >> sw-version.
`uname -n`.list
;;

sol)
# for i in $(pkginfo -l)
# do
# echo $i | perl -p -e 's/(.*)\-([^-]*?)\-([^-]*?)$/Programmname: $1\nVersion: $2\nPatchlevel: $3/' >> sw-versio
n.`uname -n`.list
# done
pkginfo -l | perl -p -e 's/(.*)\-([^-]*?)\-([^-]*?)$/Programmname: $1\nVersion: $2\nPatchlevel: $3/' >> sw-ver
sion.`uname -n`.list

;;

bsd)
echo "Teil für BSD"
;;
esac

exit 0
 
Und nun noch die Frage: wie soll Dein Output aussehen.

Code:
update SoftwareListe set
ip = '192.168.99.1',
rechner = 'alice',
vlan = '',
os = 'SUSE 2.6.12.2',
ssh = 'openssh Version:3.8p1'
where host = 'alice.aon.arcor.net';
.....
Hier die weiteren Programmnamen

Speziell der Teil Hier die weiteren Programmnamen.
 

Ähnliche Themen

Zeilen kopieren mit SED

Inhalte in einer Datei suchen und Dateiname ausgeben

JSVC Berechtigungsproblem

"Probleme" mit einem Kernelmodul

Backup Skript automatisch ausführen mit udev

Zurück
Oben