Shell Skript

Hi Leute,

habe ne nette kleine Shell Skript mir gebastelt, die mein snmpwalk ausliest und bestimmte Teile davon in eine *.txt Datei schreibt…
Weiterhin steht in der Shell Skript, dass es die alte Datei in old_$DATEINAME umwandeln soll und eine neue *.txt mir erstellen soll…
Nun habe ich diese 2 wunderschönen txt-Dateien und würde sie gerne verlgiechen wollen…aber nicht nur mit diff oder so, sondern ich möchte, dass die neue Datei die alte Datei abfragt „Hey du!? Was steht bei dir auf Zeile 7? Gibt es irgendwo eine Veränderung? Wenn ja sag sie mir und ich merk sie mir…“

Also ich möchte, dass sobald die neue datei merkt, dass sie neuere Informationen in sich trägt, sie automatisch hinter der neuen Information ein vergleich zur alten Information schreibt.

Wie kann ich das machen?

Hallo

habe ne nette kleine Shell Skript mir gebastelt, die mein
snmpwalk ausliest und bestimmte Teile davon in eine *.txt
Datei schreibt…
Weiterhin steht in der Shell Skript, dass es die alte Datei in
old_$DATEINAME umwandeln soll und eine neue *.txt mir
erstellen soll…
Nun habe ich diese 2 wunderschönen txt-Dateien und würde sie
gerne verlgiechen wollen…aber nicht nur mit diff oder so,
sondern ich möchte, dass die neue Datei die alte Datei abfragt
„Hey du!? Was steht bei dir auf Zeile 7? Gibt es irgendwo eine
Veränderung? Wenn ja sag sie mir und ich merk sie mir…“

Also ich möchte, dass sobald die neue datei merkt, dass sie
neuere Informationen in sich trägt, sie automatisch hinter der
neuen Information ein vergleich zur alten Information
schreibt.

Wie kann ich das machen?

Das hört sich nach einem Perl-Einzeiler an. Ich habe
nicht genau kapiert, wie das aussehen soll. Kannst
Du mal solche Dateien zeigen und den Weg erklären?

Außerdem gehört die Diskussion klar nach Unix/Linux
und nicht hierher. Vielleicht kannst Du dort einen
entsprechenden thread anfangen und diesen hier
vergessen?

Grüße

CMБ

Hi …
naja war mir eben nicht sicher…weil es ist ja was Programmiertes…und es ist ein Skript, da fand ich, dass es hier eben besser rein passt…

also zu meiner skript mal: (werde kurz mal n paar Zeilen hier hinhaun)

#!/bin/sh
COMMUNITY=public
IP=localhost
/etc/init.d/snmpd start > Desktop/neu

Hallo Nick,

#!/bin/sh

rm neu old_neu

Hallo Nick,
ein erster quick-and-dirty-Ansatz:

diff --unchanged-group-format='%' \
 --changed-group-format='%dn Zeile%(n=1?:n) geaendert zu: %\>' \
old\_neu neu

Keine Fehlerprüfung, hart codierte Dateinamen, Ausgabe auf Konsole.
Die Ausgabe von Kommentaren direkt in die Datei neu wird schwierig und ist vielleicht nicht ratsam, weil die neue Datei später die alte wird und spätestens dann stören die Kommentare beim Vergleichen…

Viele Grüße
Marvin

HI,

hast recht, sollte mv sein…
Die Abfrage ob es diese Datei schon gibt, hab ich auch noch nicht raus…Beschäftige mich mit Shell Skripten erst seit 2 Tagen.

Am Ende möchte ich diese Shell Skript von einem Agenten ausführen lassen und alle aktuellen Software Versionen mir zurück geben lassen.

Damit ich immer weiß, welche Software auf welchem Rechner bzw. Server ist und welche Version. Die Shell Skript geht eben bis jetzt nur soweit, dass ich den Rechner abfragen kann, mir alles in einer Datei anzeigen lassen kann aber 1. noch nicht die Rückmeldung bekomme und 2. dieser Vergleich zwischen den beiden Dateien.

…und ja die Datei ist immer gleich angelegt, von daher geht der Befehl comm…welche Sprache ist eigentlich relativ, mir würdes es am liebsten gefallen, wenns dafür gleich eine Lösung gebe, die man in diese Skript mit integrieren kann.

Vielen Dank

ein erster quick-and-dirty-Ansatz:

diff --unchanged-group-format=’%’
–changed-group-format=’%dn Zeile%(n=1?:n) geaendert zu:
%>’
old_neu neu

Danke für deine Bemühungen, hab das mal getestet ist n ziemlich guter einfall ;O

Und das mit der Idee, die Kommentare in die „neu“ zu schreiben, ist wirklich nicht so gut…Im Prinzip müsste doch jetzt nur noch hinter deine Idee eine IF Abfrage kommen, die fragt ob es eine Änderung gibt, wenn ja schreib diese in eine neue Datei z.B. aenderung.txt und sende diese Datei an den Agenten zurück, wenn es keine Änderung gibt dann egal…

Werde mich mal dran versuchen, da ich aber eher ein lausiger progger bin wäre es nett wenn jmd das lösen könnte…

gruß Nick

Hallo Nick,

ein erster quick-and-dirty-Ansatz:

diff --unchanged-group-format=’%’
–changed-group-format=’%dn Zeile%(n=1?:n) geaendert zu:
%>’
old_neu neu

Im Prinzip müsste doch
jetzt nur noch hinter deine Idee eine IF Abfrage kommen, die
fragt ob es eine Änderung gibt, wenn ja schreib diese in eine
neue Datei z.B. aenderung.txt und sende diese Datei an den
Agenten zurück, wenn es keine Änderung gibt dann egal…

Werde mich mal dran versuchen, da ich aber eher ein lausiger
progger bin wäre es nett wenn jmd das lösen könnte…

Glaub ich gern, aber müsste jemand vor Ort machen, weil es da doch noch etliche Detailfragen gibt, z.B. könnte es ja nützlich sein, auch einen Zeitstempel der Änderung mit auszugeben. Da es sich offenbar um eine Produktionsumgebung handelt, müsste außerdem unbedingt an den kritischen Stellen eine Errordatei erzeugt werden, also sowas

 2\>\>error.log

Denkbar wäre auch noch eine automatische Mail-Benachrichtigung bei schwerwiegenden Fehlern, usw. usw.

Ob eine Datei existiert, bekommst Du so heraus:

if [-f $Dateiname] ; then
echo "Datei vorhanden"
else
echo "keine Datei vorhanden"
fi

zumindest in der Bash, aber in anderen Shells ist das glaube ich, genauso.
Um zu kontrollieren, ob es Veränderungen gab, kannst Du einfach den Exitstatus (also $?) von diff abtesten, wenn $? == 0 ist, waren beide Dateien gleich, $? == 1 bedeutet, es gab Unterschiede, und $? == 2 heisst, es gab Probleme:

if [$? == 0]; then
echo "Kein Unterschied"
else...
fi

Ist aber wahrscheinlich nicht mal notwendig, wenn Du diff so umschreibst, daß es nichts ausgibt, wenn die Dateien gleich sind. Geht einfach, nur die Zeile mit --unchanged-group-format weglassen…
Das waren nur ein paar kleine Anregungen, kannst ja schon mal diese Code-Schnipsel zusammenbauen :wink:

Muß jetzt leider erstmal aus Zeitmangel abbrechen, die Pflicht ruft…

Viele Grüße
Marvin

Hey Danke ;O

der Zeitstempel ist nicht wild, da dies alles über einen Agenten abgefragt wird…dieser lässt die skript aller 24h einmal durchlaufen und merkt alleine wenn was „komisch“ ist ;O

Mit der Mail ist auch nicht wichtig, da alles am ende in eine DB läuft und sich dort einer kümmert…

Mit der Dateiabfrage kann ich was anfangen ;O und mit der Abfrage von dem diff klingt nicht schlecht, muss ich mal schaun. Habe derzeit eine andere Lösung mit perl aber mal sehn welche sich dafür besser eignet…

Den error.log habe ich schon…da am ende eine Prüfsumme steht die zu 100% stimmen muss und wenn nicht gibts die nette kleine Meldung „hey hier stimmt etwas nicht“

OK aber wenn ich das jetzt habe.

diff --unchanged-group-format=’%’ \
–changed-group-format=’%dn Zeile%(n=1?:n) geaendert zu:%>’ \
old_neu neu
if [$? == 0]; then
echo „Kein Unterschied“
else.???..
fi

wie schreib ich in das else dann „hey was für unterschiede sind aufgetaucht“ ? >> superneu.txt

kann man in dem diff nicht schon sagen, dass wenn etwas abweicht, dass er dort bereits eine neue datei anlegt mit den abweichungen?

danke

diff --unchanged-group-format= xXx das hier einfach leer lassen dan gehts ;O \
–old-group-format=’%dn Zeile%(n=1?:n) geloescht: %’ \
–changed-group-format=’%dn Zeile%(n=1?:n) geaendert
zu:%>’ \
old_neu neu
if [$? == 0]; then
echo „Kein Unterschied“
else
echo "es gab einen unterschied
fi

Hallo Nick,

OK aber wenn ich das jetzt habe.

diff --unchanged-group-format=’%
wie schreib ich in das else dann „hey was für unterschiede
sind aufgetaucht“ ? >> superneu.txt

kann man in dem diff nicht schon sagen, dass wenn etwas
abweicht, dass er dort bereits eine neue datei anlegt mit den
abweichungen?

Ja, das meinte ich, als ich vorher mal geschrieben habe, daß man die Abfrage

[$? = 0]

wahrscheinlich gar nicht braucht. Du leitest einfach die Ausgabe von diff direkt in die Logdatei um, also so:

diff ... \>\> superneu.txt 2\>\>error.log

Den diff-Befehl habe ich jetzt einfach gekürzt, will ja nicht jedesmal alles hinschreiben, aber ich denke, ist schon klar.
Das --unchanged-group-format=’%
eins
zwei
drei

und Datei old_neu so:

drei
zwei
eins

dann würde die --unchanged-group-format=’% ein Platzhalter für den neuen Inhalt der Zeile. %dn ist die alte Zeilennummer, %dN die neue Zeilennummer, d.h., wenn dich die Zeilennr. nicht interessieren, kannst Du den vorderen Teil auch weglassen, also das hier:

%dn Zeile%(n=1?:n)

Kommt eben drauf an, wie genau Du die Veränderungen dokumentieren willst.
Aber wie gesagt, mit der Umleitung von diff … >> superneu.txt 2>>error.log schreibt es gleich alle Veränderungen nach superneu.txt und alle Fehlermeldungen nach error.log
Ich hoffe, ich habe alle Klarheiten beseitigt :wink:

Viele Grüße
Marvin

Hallo Nick,

diff --unchanged-group-format= xXx das hier einfach leer
lassen dan gehts ;O \

Ja, oder noch besser, einfach weglassen, siehe mein Posting von 15:13

–old-group-format=’%dn Zeile%(n=1?:n) geloescht: %’ \
–changed-group-format=’%dn Zeile%(n=1?:n) geaendert
zu:%>’ \
old_neu neu
if [$? == 0]; then
echo „Kein Unterschied“
else
echo "es gab einen unterschied

Ja, nur das letzte Anführungszeichen nicht vergessen :wink:
Ansonsten lies dir auch meinen Beitrag von 15:13 durch, hat sich gerade überschnitten…

Viele Grüße
Marvin

Jo danke dir ;O …ich denke bei solchen sachen immer viel zu kompliziert…wenn das nicht, dann das und rüber nüber etc.

aber hab es jetzt denk mal verstanden ;O

…aber eine sache habe ich noch…

wie kann ich in einer datei die zeilen zählen?

nehmen wir mal an, man lässt sich mit
snmp -v 1 -c public localhost --> hrSWInstalledName

Hallo nick,

wie kann ich in einer datei die zeilen zählen?

Zeilen zählen ist relativ simpel. Dazu gibt es den Befehl wc

wc datei

gibt drei Zahlen aus, zuerst die Anzahl Zeilen, dann die Anzahl der Wörter und zum Schluß wieviel Bytes die datei groß ist. Willst Du nur die Anzahl Zeilen wissen, machst Du einfach

wc -l datei

Was wc noch so kann, erfährst Du (wie bei fast allen Befehlen), indem Du einfach

man wc

eingibst, oder etwas kürzere Ausgabe

wc --help

Brauchst Du die Zeilenzahl in einer Variablen, kannst Du folgendes machen:

i=$(wc -l 



> nehmen wir mal an, man lässt sich mit  
> snmp -v 1 -c public localhost --\> hrSWInstalledName

hi danke dirt ;O

wusste nicht das das am ende doch alles so simpel ist ;O

also wenn du in die shell folgendes eingibst:

/etc/init.d/snmpd start ### startet den dafür benötigten Dienst
/usr/bin/snmpwalk -v 1 -c public localhost hrSWInstalledName

liste es dir alle auf deinem Rechner installierte Programme auf.
die Ausgabe sie in etwa so aus:

blabla.hrSWInstalledName.1 „programname versionsnummer“
blabla.hrSWInstalledName.2 „programname versionsnummer“
blabla.hrSWInstalledName.3 „programname versionsnummer“
blabla.hrSWInstalledName.4 „programname versionsnummer“

er listet dir eben alle Programme + die derzeitige Version des Programms auf und hängt dabei vor jedes Programm eine Zahl die er immer +1 rechnet, deswegen kann man mit
/usr/bin/snmpwalk -v 1 -public localhost hrSWInstalledName.ZAHL
auch einzelne, bestimmte Programme ansprechen…

naja und wenn man sich einfach einmal alle ausgegeben lassen hat, steht eben bei dem letzten Programm die höchste Zahl und damit weiß man wie oft er diesen Vorgang wiederholen soll…

Ich wollte es ja wissen, da ich diese Ausgaben nach einem bestimmten System ordnen lasse…

mfg. Nick

Hallo Nick,

/usr/bin/snmpwalk -v 1 -c public localhost hrSWInstalledName
die Ausgabe sie in etwa so aus:

blabla.hrSWInstalledName.1 „programname versionsnummer“
blabla.hrSWInstalledName.2 „programname versionsnummer“
blabla.hrSWInstalledName.3 „programname versionsnummer“
blabla.hrSWInstalledName.4 „programname versionsnummer“

Ich wollte es ja wissen, da ich diese Ausgaben nach einem
bestimmten System ordnen lasse…

Ach so, wie Du schon gesagt hattest, wolltest Du nur wissen, wieviel Zeilen in der Datei sind…
Diesmal habe ich zu kompliziert gedacht, und meinte, das sei noch was zusätzliches, extra zur Zeilenzahl :wink:
Da ist das ja gelöst.

Viele Grüße
Marvin