PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SHELL] String analyse und Variablen verarbeitung



R4R
27-10-2006, 08:28
Hallo Leute,

ihr habt mir bereits öfters geholfen dafür bin ich euch auch dankbar :)
Diesmal geht es darum, dass ich die Datei /etc/passwd analysieren möchte.

Der String lautet bspw. wie folgt:

hostname:x:uid:gid:OG/UG/User/Datenordner/Bilder:homedir:shell

Nur die Fetten Einträge sind wichtig. OG=OberKategorie, UG=UnterKategorie,User=User. Wobei diese Werte unterschiedlich sein können.

Jetzt habe ich in einem Ordner eine Datei hochgeladen die den Namen hat:

hostname.27-10-2006.tgz

Crontab guckt nun nach ob eine Neue Datei vorhanden ist. Wenn ja dann wird in der /etc/passwd nachgeschaut (ob es diesen hostnamen gibt), wenn ja dann soll er das archive in "/bilder/" + "OG/UG/User/Datenordner/Bilder/%archiveDatum%" entpacken.

Ich hoffe Ihr könnt mir helfen, da meine codingfähigkeiten leider nicht so toll sind :( Vielen dank im vorraus


R4R

OpOs
27-10-2006, 09:53
und was iss jetzt deine frage? sollen wir dir dein script schreiben?

oder willst du wissen, wie du den string zerlegen kannst? dafuer kannst du awk nehmen...

R4R
28-10-2006, 10:22
am liebsten beides :)

R4R
29-10-2006, 02:57
kann mir vielleicht jemand den parameter für awk nennen ?

Romanday
29-10-2006, 07:35
kann mir vielleicht jemand den parameter für awk nennen ?

Ich weiß zwar nicht welchen Parameter Du brauchst, aber den auf
jeden Fall.:D
awk -F: '{print $1}'

R4R
29-10-2006, 22:49
ich brauche den parameter um anhand vom hostnamen den string zu filtern:


OG/UG/User/Datenordner/Bilder

zu dem passendem hostnamen immer den variablen string einzulesen.

rais
29-10-2006, 23:06
Moin moin,

ich brauche den parameter um anhand vom hostnamen den string zu filtern:

mir ist eigentlich immer noch nicht ganz klar, was Du eigentlich vorhast, aber kannst Du nicht einfach inn dem Ordner mit Deinen ganzen hostname.dd-mm-yyyy.tgz mit


for I in ls *.tgz; do
X=${I%%.*} #das sollte den hostname ergeben
if [ -z `grep $X /etc/passwd` ]; then
echo "Sorry, unknown host $X."
else
pushd .
cd /bilder
tar xzf /wo/Deine/tgz/sind/$I
popd
fi
done
o.ä. zurande kommen?
MfG,

R4R
30-10-2006, 07:35
okay rais, ich versuche es nochmal ganz genau zu erklären.
Ich habe Clients die über USB und Hotplug Bilder von einer Digitalkamera auslesen. Das Script kopiert die gepackte tgz Datei auf einen Server. Auf diesem gibt es einen Ordner der diese Dateien archiviert. In diesem Ordner soll über crontab alle 5min ein Script durchlaufen welches überprüft ob eine neue Datei da ist, wenn ja lautet der Dateiname host1.datum.tgz die 2. lautet bspw. host2.datum.tgz. Jetzt habe ich mir überlegt ich muss es so hinbekommen, dass die Bilder dierekt in das jeweilige Userprofil entpackt werden. Also mounte ich auf den Server wo die Bilder vom Client aus geschickt wurden die Homeordner von allen Usern. Damit das Script weiss zu welchem hostnamen welche .tgz datei gehört, habe ich dies unter der Datei /etc/passwd hinterlegt (man hat eine Comment Zeile) in dieser habe ich den Pfad eingetragen wohin es kopiert werden soll. Als Beispiel host1.30-10-2006.tgz jetzt wird in der passwd geschaut welchen Pfad host1 hat:

host1:x:uid:gid:EDV/Hardware/Peter/Daten/Bilder:homedir:shell
host2:x:uid:gid:Verwaltung/Rechnungswesen/Mueller/Daten/Bilder:homedir:shell
host3:x:uid:gid:Hausmeister/Auto/Maier/Daten/Bilder:homedir:shell

(wobei nur die Fetten Einträge interessant sind)

Jetzt würde das Script folgendes machen.


tar xzvf host1.30-10-2006.tgz -C /EDV/Hardware/Peter/Daten/Bilder/DatumVomArchive

(also nimmt schaut das Script erstma nach dem Hostnamen und anhand dessen, wird der Pfad übergeben.)

Ich hoffe das Hilft weiter.

R4R
30-10-2006, 08:25
habe gerade bisschen geschaut:
ich kann nun mit diesem Befehl die Commentline auslesen:


awk 'BEGIN {FS = ":"} {print $5}' /etc/passwd

rais
30-10-2006, 18:18
habe gerade bisschen geschaut:
ich kann nun mit diesem Befehl die Commentline auslesen:


awk 'BEGIN {FS = ":"} {print $5}' /etc/passwd
ähh ja - brauchst Du das nicht bloß in meinem Teil zu adaptieren?



for I in ls *.tgz; do
X=${I%%.*} #das sollte den hostname ergeben
D=${I#*.}
D=${D%.tgz} #hier sollte das Datum drin stehen
P=`grep $X /etc/passwd | awk 'BEGIN {FS = ":"} {print $5}'`
if [ -z "$P" ]; then
echo "Sorry, unknown host $X."
mv $I bad-hosts
else
tar xzf $I -C /$P/$D
mv $I good-hosts
fi
done
Sicher mußt Du hier noch das Eine oder Andere abfangen - z.B. was passiert, wenn ein `host' sich mit einer User-ID einschleicht? Oder was passiert, wenn im Hostnamen Punkte drin sind? Oder auch: was passiert bei awk mit der Anforderung fürs fünfte Element, wenn beim grep zuvor schon nix bei rausgekommen ist? Und was ist eigentlich ganz allgemein mit Dateien, die gar nicht der Konvention host.dd-mm-yyyy.tgz entsprechen?
Statt tar kannst Du ja erstmal echo auf die Parameterliste zu tar machen, dann siehst Du schonmal, ob es so funzt, wie es gedacht ist - oder eben ob völliger Blödsinn bei rauskommt :D

BTW: beENDet man bei awk denn nicht, was man BEGINnt? :p
MfG,

R4R
30-10-2006, 18:42
dank dir :)
ich habs temporär so gelöst:



#!/bin/bash
host=$(ls /upload/ | awk -F. '{print $1}')
datum=$(ls /upload/ | awk -F. '{print $2}')
pfad=$(cat /etc/passwd | grep $host | awk -F: '{print $5}')
mkdir /home/$pfad/bilder/$host.$datum


deine lösung werde ich morgen testen. vielen dank

rais
30-10-2006, 20:44
dank dir :)
ich habs temporär so gelöst:



#!/bin/bash
host=$(ls /upload/ | awk -F. '{print $1}')
datum=$(ls /upload/ | awk -F. '{print $2}')
pfad=$(cat /etc/passwd | grep $host | awk -F: '{print $5}')
mkdir /home/$pfad/bilder/$host.$datum


deine lösung werde ich morgen testen. vielen dank
auch nicht schlecht, allerdings würde ich mich fragen: "was passiert bei mehr als einem neuen Eintrag in /upload ?" Bei den heutigen Rechnern kann innerhalb von 5 Minuten viel passieren :D
Und mit dem in /upload stehendem tgz muß auch noch was passieren, schließlich willst Du ja nach fünf Minuten nicht dasselbe Archiv nochmal behandeln.
Oder vllt schlimmer noch: Was passiert bei _gar_ keinem neuen Eintrag ?
also vllt in etwas wie


for I in `ls /upload/*.tgz` dummy; do
if [ $I == "dummy" ]; then
# do nothing
else
:
fi
done
klammern und gut ist.;)
MfG,

Romanday
30-10-2006, 21:29
dank dir :)
ich habs temporär so gelöst:



pfad=$(cat /etc/passwd | grep $host | awk -F: '{print $5}')




geht auch ohne cat + grep

awk -F: '$1~/^'$host'$/{print $5}' /etc/passwd

R4R
31-10-2006, 07:31
auch nicht schlecht, allerdings würde ich mich fragen: "was passiert bei mehr als einem neuen Eintrag in /upload ?" Bei den heutigen Rechnern kann innerhalb von 5 Minuten viel passieren :D
Und mit dem in /upload stehendem tgz muß auch noch was passieren, schließlich willst Du ja nach fünf Minuten nicht dasselbe Archiv nochmal behandeln.
Oder vllt schlimmer noch: Was passiert bei _gar_ keinem neuen Eintrag ?
also vllt in etwas wie


for I in `ls /upload/*.tgz` dummy; do
if [ $I == "dummy" ]; then
# do nothing
else
:
fi
done
klammern und gut ist.;)
MfG,


also verstehe es noch nicht ganz:

es werden alle *.tgz dateien eingelesen und dann wird nichts getan ?
sorry wie gesagt meine codingkentnisse sind nicht die besten.

rais
31-10-2006, 18:25
also verstehe es noch nicht ganz:

es werden alle *.tgz dateien eingelesen und dann wird nichts getan ?
sorry wie gesagt meine codingkentnisse sind nicht die besten.
Nee, nur wenn die Datei "dummy" heißt (sprich, wenn gar keine Dateien gefunden wurden oder eben das Ende der Liste erreicht ist).
Sonst wird der else-Teil ausgeführt, in dem Du Deinen Abarbeitungsblock noch einsetzen mußt (eben statt ":") und halt statt selbst ls aufzurufen dann einfach $I auswertest (da steht der Name ja nu schon drin).
btw, es müsste wohl

if [ "$I" == "dummy" ]; thenzu Anfang heißen.
MfG,