[Shell Script] Daten aus einer Datei lesen und verarbeiten
[Shell Script] Daten aus einer Datei lesen und verarbeiten
Hallo zusammen,
bin nicht richtig fit im Shellscript schreiben und hoffe bei Euch Hilfe zu erhalten.
Ich habe eine xferlog Datei wo ja so einiges wichtiges drin steht.
Ich benötige aus der Datei für einen User zu einem Datum die gesendeten bzw empfangenen Bytes ausgelesen. Das Script solle jede Nacht um 00.01 starten und mir so vom letzten Tag den Trafiic eines User in eine Varaible schreiben und in einer Datei ablegen.
Geht sowas überhaupt oder gibt es was anderes womit ich den Traffic von proftpd bezogen auf User und Datum auslesen kann.
Danke und Gruß
bin nicht richtig fit im Shellscript schreiben und hoffe bei Euch Hilfe zu erhalten.
Ich habe eine xferlog Datei wo ja so einiges wichtiges drin steht.
Ich benötige aus der Datei für einen User zu einem Datum die gesendeten bzw empfangenen Bytes ausgelesen. Das Script solle jede Nacht um 00.01 starten und mir so vom letzten Tag den Trafiic eines User in eine Varaible schreiben und in einer Datei ablegen.
Geht sowas überhaupt oder gibt es was anderes womit ich den Traffic von proftpd bezogen auf User und Datum auslesen kann.
Danke und Gruß
wird noch ausgefüllt. . .
Re: [Shell Script] Daten aus einer Datei lesen und verarbeit
Hi,
wie Duff schon sagte Perl koennte die Loesung sein, aber auch awk-sed-shell waere denkbar.
wie Duff schon sagte Perl koennte die Loesung sein, aber auch awk-sed-shell waere denkbar.
Dafuer gibt's "cron"plato13 hat geschrieben:Das Script solle jede Nacht um 00.01 starten
Roland
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
Hallo zusammen,
in der xferlog steht folgendes drin als Beispiel:
Datum IP Adresse Bytes Verzeihnis
Sun Nov 25 04:54:16 2007 0 xxx.xxx.xxx.xxx 447930 /ftp/user1/send/BB005908/1_Bild_001.jpg b _ i r user1 ftp 0 * c
Sun Nov 25 04:54:17 2007 0 xxx.xxx.xxx.xxx 374523 /ftp/user1/send/BB005908/2_Bild_002.jpg b _ i r user1 ftp 0 * c
Sun Nov 25 04:54:18 2007 0 xxx.xxx.xxx.xxx 340449 /ftp/user1/send/BB005908/3_Bild_004.jpg b _ i r user1 ftp 0 * c
Sun Nov 25 04:54:20 2007 0 xxx.xxx.xxx.xxx 377439 /ftp/user2/send/BB005908/4_Bild_005.jpg b _ i r user2 ftp 0 * c
Sun Nov 25 04:54:21 2007 0 xxx.xxx.xxx.xxx 295895 /ftp/user2/send/BB005908/5_Bild_006.jpg b _ i r user2 ftp 0 * c
Sun Nov 25 04:54:22 2007 0 xxx.xxx.xxx.xxx 274998 /ftp/user2/send/BB005908/6_Bild_007.jpg b _ i r user2 ftp 0 * c
Sun Nov 25 04:54:23 2007 0 xxx.xxx.xxx.xxx 409051 /ftp/user3/send/BB005908/7_Bild_008.jpg b _ i r user3 ftp 0 * c
Sun Nov 25 04:54:24 2007 0 xxx.xxx.xxx.xxx 354890 /ftp/user3/send/BB005908/8_Bild_009.jpg b _ i r user3 ftp 0 * c
Nun hatte ich gerne nach user1 user2 und user3 die Summe von den übertragenden Bytes iin je einer Varibale für einen Tag.
Hoffe habe mich so richtig ausgedrückt. . . und Perl kann ich lerider gar nicht.
Danke und Gruß
in der xferlog steht folgendes drin als Beispiel:
Datum IP Adresse Bytes Verzeihnis
Sun Nov 25 04:54:16 2007 0 xxx.xxx.xxx.xxx 447930 /ftp/user1/send/BB005908/1_Bild_001.jpg b _ i r user1 ftp 0 * c
Sun Nov 25 04:54:17 2007 0 xxx.xxx.xxx.xxx 374523 /ftp/user1/send/BB005908/2_Bild_002.jpg b _ i r user1 ftp 0 * c
Sun Nov 25 04:54:18 2007 0 xxx.xxx.xxx.xxx 340449 /ftp/user1/send/BB005908/3_Bild_004.jpg b _ i r user1 ftp 0 * c
Sun Nov 25 04:54:20 2007 0 xxx.xxx.xxx.xxx 377439 /ftp/user2/send/BB005908/4_Bild_005.jpg b _ i r user2 ftp 0 * c
Sun Nov 25 04:54:21 2007 0 xxx.xxx.xxx.xxx 295895 /ftp/user2/send/BB005908/5_Bild_006.jpg b _ i r user2 ftp 0 * c
Sun Nov 25 04:54:22 2007 0 xxx.xxx.xxx.xxx 274998 /ftp/user2/send/BB005908/6_Bild_007.jpg b _ i r user2 ftp 0 * c
Sun Nov 25 04:54:23 2007 0 xxx.xxx.xxx.xxx 409051 /ftp/user3/send/BB005908/7_Bild_008.jpg b _ i r user3 ftp 0 * c
Sun Nov 25 04:54:24 2007 0 xxx.xxx.xxx.xxx 354890 /ftp/user3/send/BB005908/8_Bild_009.jpg b _ i r user3 ftp 0 * c
Nun hatte ich gerne nach user1 user2 und user3 die Summe von den übertragenden Bytes iin je einer Varibale für einen Tag.
Hoffe habe mich so richtig ausgedrückt. . . und Perl kann ich lerider gar nicht.
Danke und Gruß
wird noch ausgefüllt. . .
Hi,
ganz grob koennte dein Script wie folgt aussehen:
Das ist jetzt nur so eine Idee auf die schnelle, sollte aber so machbar sein.
ganz grob koennte dein Script wie folgt aussehen:
Code: Alles auswählen
for benutzer in user1 user2 user3 ...
do
grep $benutzer DEINEDATEI|grep $(date)|cut ...|bc
done
Roland
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
Ja genau. So könnte es aussehen.
Wenn das logfile nicht zur groß und du die Benutzer nicht alle einzeln aufführen möchtest, könnte es so z.B. gehen:
Beispiel Ausgabe:
Wenn das logfile nicht zur groß und du die Benutzer nicht alle einzeln aufführen möchtest, könnte es so z.B. gehen:
Code: Alles auswählen
#!/bin/bash
datum="`date '+%b %d'`"
benutzer=`cat test.log | awk -F"/" '{print $3}'|sort|uniq`
for user in `echo $benutzer`
do
i=0
j=0
for i in `cat test.log |awk "/$datum/" | grep $user | awk '{print $8}'`
do
j=`expr $j + $i`
done
echo "User: $user hat $j Bytes empfangen"
done
Code: Alles auswählen
daniel@debian:/tmp> cat test.log
Sun Nov 26 04:54:16 2007 0 xxx.xxx.xxx.xxx 100 /ftp/user1/send/BB005908/1_Bild_001.jpg b _ i r user1 ftp 0 * c
Sun Nov 25 04:54:17 2007 0 xxx.xxx.xxx.xxx 200 /ftp/user1/send/BB005908/2_Bild_002.jpg b _ i r user1 ftp 0 * c
Sun Nov 26 04:54:18 2007 0 xxx.xxx.xxx.xxx 10 /ftp/user1/send/BB005908/3_Bild_004.jpg b _ i r user1 ftp 0 * c
Sun Nov 25 04:54:20 2007 0 xxx.xxx.xxx.xxx 1 /ftp/user2/send/BB005908/4_Bild_005.jpg b _ i r user2 ftp 0 * c
Sun Nov 25 04:54:21 2007 0 xxx.xxx.xxx.xxx 2 /ftp/user2/send/BB005908/5_Bild_006.jpg b _ i r user2 ftp 0 * c
Sun Nov 25 04:54:22 2007 0 xxx.xxx.xxx.xxx 3 /ftp/user2/send/BB005908/6_Bild_007.jpg b _ i r user2 ftp 0 * c
Sun Nov 26 04:54:23 2007 0 xxx.xxx.xxx.xxx 1 /ftp/user3/send/BB005908/7_Bild_008.jpg b _ i r user3 ftp 0 * c
Sun Nov 25 04:54:24 2007 0 xxx.xxx.xxx.xxx 1 /ftp/user3/send/BB005908/8_Bild_009.jpg b _ i r user3 ftp 0 * c
Sun Nov 25 04:54:16 2007 0 xxx.xxx.xxx.xxx 90 /ftp/user1/send/BB005908/1_Bild_001.jpg b _ i r user1 ftp 0 * c
Sun Nov 25 04:54:17 2007 0 xxx.xxx.xxx.xxx 100 /ftp/user1/send/BB005908/2_Bild_002.jpg b _ i r user1 ftp 0 * c
Sun Nov 26 04:54:18 2007 0 xxx.xxx.xxx.xxx 100 /ftp/user1/send/BB005908/3_Bild_004.jpg b _ i r user1 ftp 0 * c
Sun Nov 25 04:54:20 2007 0 xxx.xxx.xxx.xxx 4 /ftp/user2/send/BB005908/4_Bild_005.jpg b _ i r user2 ftp 0 * c
Sun Nov 25 04:54:21 2007 0 xxx.xxx.xxx.xxx 10 /ftp/user2/send/BB005908/5_Bild_006.jpg b _ i r user2 ftp 0 * c
Sun Nov 25 04:54:22 2007 0 xxx.xxx.xxx.xxx 30 /ftp/user2/send/BB005908/6_Bild_007.jpg b _ i r user2 ftp 0 * c
Sun Nov 25 04:54:23 2007 0 xxx.xxx.xxx.xxx 1 /ftp/user3/send/BB005908/7_Bild_008.jpg b _ i r user3 ftp 0 * c
Sun Nov 26 04:54:24 2007 0 xxx.xxx.xxx.xxx 1 /ftp/user3/send/BB005908/8_Bild_009.jpg b _ i r user3 ftp 0 * c
daniel@debian:/tmp> ./test_logger.sh
User: user1 hat 210 Bytes empfangen
User: user2 hat 0 Bytes empfangen
User: user3 hat 2 Bytes empfangen
Oh, yeah!
Guten Morgen zusammen,
erstmal vielen Dank von Euch allen Eure Lösungs wege haben mich schon weiter gebracht besonders der von Duff.
Zu dem Lösungsweg habe ich noch eine Frage:
Beim zusammenrechnen der Bytes benutzt du expr wofür steht das?
Desweiteren habe ich eingebaut das die Bytes in KB un MB und GB umgerechnet werden, doch leider wird zu sehr gerundet, wie kann ich denn die Kommazahlen darstellen:
Habe folgendes bei dufs Lösung dazu gebastelt:
i=0
j=0
k=0
m=0
g=0
k1=1024 --> zum umrechnen
m1=1048576 --> zum umrechnen
g1=1073741824 --> zum umrechnen
Hier wird gerechnet
j=`expr $j + $i` --> Ergebnis sind Bytes
k=`expr $j / $k1` --> Ergebnis sind KB
m=`expr $j / $m1` --> Ergebnis sind MB
g=`expr $j / $g1` --> Ergebnis sind GB
Doch die Ausgabe ist zu sehr gerundet?? Was mache ich da falsch??
Danke und Gruß
erstmal vielen Dank von Euch allen Eure Lösungs wege haben mich schon weiter gebracht besonders der von Duff.
Zu dem Lösungsweg habe ich noch eine Frage:
Beim zusammenrechnen der Bytes benutzt du expr wofür steht das?
Desweiteren habe ich eingebaut das die Bytes in KB un MB und GB umgerechnet werden, doch leider wird zu sehr gerundet, wie kann ich denn die Kommazahlen darstellen:
Habe folgendes bei dufs Lösung dazu gebastelt:
i=0
j=0
k=0
m=0
g=0
k1=1024 --> zum umrechnen
m1=1048576 --> zum umrechnen
g1=1073741824 --> zum umrechnen
Hier wird gerechnet
j=`expr $j + $i` --> Ergebnis sind Bytes
k=`expr $j / $k1` --> Ergebnis sind KB
m=`expr $j / $m1` --> Ergebnis sind MB
g=`expr $j / $g1` --> Ergebnis sind GB
Doch die Ausgabe ist zu sehr gerundet?? Was mache ich da falsch??
Danke und Gruß
wird noch ausgefüllt. . .
Hi,
anstelle des expr koenntest du auch "bc" verwenden, ich denke da wird weniger gerundet.
anstelle des expr koenntest du auch "bc" verwenden, ich denke da wird weniger gerundet.
Roland
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
Noch eine weitere Frage
Hallo zusammen,
erstmal wieder vielen Dank, habe das Duff script benutzt und komme damit ganz gut zurecht. Habe einige Erweiterungen noch eingebaut ist vielleicht kompliziert gelöst aber wie gesagt bin kein Programmierer. . .
Nun habe ich noch ein Frage:
Das was im Log steht noch anders auszuwerten:
Sun Nov 25 04:54:16 2007 0 xxx.xxx.xxx.xxx 447930 /ftp/user1/send/BB005908/1_Bild_001.jpg b _ i r user1 ftp 0 * c
Hinter dem Bildnamen giibt es noch an 12ter Stelle glaube ich mit awk {print$12} das kleine "i" was bei proftpd als incomming Verbindung gilt Bei einigen steht auch "o" für outgoing. Ich möchte nun das Script so erweiteren das nun auch noch nach diesen zwei Punkten unterschieden wird
Hatte es mal eingebaut in die zweite for schleife wo einbfach mit |grep i und ein weiteres script mit |grep o wie kann ich es in das obige script mit einfliesen lassen.
Ich weiss ich nerve aber ich brauche das unbedingt.
Vielen Dank
Gruß
erstmal wieder vielen Dank, habe das Duff script benutzt und komme damit ganz gut zurecht. Habe einige Erweiterungen noch eingebaut ist vielleicht kompliziert gelöst aber wie gesagt bin kein Programmierer. . .
Nun habe ich noch ein Frage:
Das was im Log steht noch anders auszuwerten:
Sun Nov 25 04:54:16 2007 0 xxx.xxx.xxx.xxx 447930 /ftp/user1/send/BB005908/1_Bild_001.jpg b _ i r user1 ftp 0 * c
Hinter dem Bildnamen giibt es noch an 12ter Stelle glaube ich mit awk {print$12} das kleine "i" was bei proftpd als incomming Verbindung gilt Bei einigen steht auch "o" für outgoing. Ich möchte nun das Script so erweiteren das nun auch noch nach diesen zwei Punkten unterschieden wird
Hatte es mal eingebaut in die zweite for schleife wo einbfach mit |grep i und ein weiteres script mit |grep o wie kann ich es in das obige script mit einfliesen lassen.
Ich weiss ich nerve aber ich brauche das unbedingt.
Vielen Dank
Gruß
wird noch ausgefüllt. . .
Hallo,
es funktioniert zwar noch nicht so, wie es sollte, aber finde auf die schnelle irgendwie den Fehler nicht:
es funktioniert zwar noch nicht so, wie es sollte, aber finde auf die schnelle irgendwie den Fehler nicht:
Code: Alles auswählen
daniel@debian:/tmp> cat test_logger.sh
#!/bin/bash
#set -x
datum="`date '+%b %d'`"
benutzer=`cat test.log | awk -F"/" '{print $3}'|sort|uniq`
input=0
output=0
for user in `echo $benutzer`
do
j=0
i=0
o=0
#for i in `cat test.log |awk "/$datum/" | grep $user | awk '{print $8, $12}'`
cat test.log |awk "/$datum/" | grep $user | awk '{print $8, $12}' |
while read line
do
echo $line
j=`echo $line|awk '{print $1}'`
if [ "`echo $line|awk '{print $2}'`" = "i" ]
then
i=`expr $i + $j`
else
o=`expr $o + $j`
fi
echo "USER: $user\tInput: $i"
echo "USER: $user\tOutput: $o"
done
echo "User: $user hat $i , $o Bytes empfangen"
done
daniel@debian:/tmp> ./test_logger.sh
200 o
USER: user1\tInput: 0
USER: user1\tOutput: 200
90 i
USER: user1\tInput: 90
USER: user1\tOutput: 200
100 i
USER: user1\tInput: 190
USER: user1\tOutput: 200
User: user1 hat 0 , 0 Bytes empfangen
1 i
USER: user2\tInput: 1
USER: user2\tOutput: 0
2 i
USER: user2\tInput: 3
USER: user2\tOutput: 0
3 i
USER: user2\tInput: 6
USER: user2\tOutput: 0
4 i
USER: user2\tInput: 10
USER: user2\tOutput: 0
10 i
USER: user2\tInput: 20
USER: user2\tOutput: 0
30 i
USER: user2\tInput: 50
USER: user2\tOutput: 0
User: user2 hat 0 , 0 Bytes empfangen
1 i
USER: user3\tInput: 1
USER: user3\tOutput: 0
1 i
USER: user3\tInput: 2
USER: user3\tOutput: 0
User: user3 hat 0 , 0 Bytes empfangen
daniel@debian:/tmp> cat test.log
Sun Nov 26 04:54:16 2007 0 xxx.xxx.xxx.xxx 100 /ftp/user1/send/BB005908/1_Bild_001.jpg b _ i r user1 ftp 0 * c
Sun Nov 28 04:54:17 2007 0 xxx.xxx.xxx.xxx 200 /ftp/user1/send/BB005908/2_Bild_002.jpg b _ o r user1 ftp 0 * c
Sun Nov 26 04:54:18 2007 0 xxx.xxx.xxx.xxx 10 /ftp/user1/send/BB005908/3_Bild_004.jpg b _ i r user1 ftp 0 * c
Sun Nov 28 04:54:20 2007 0 xxx.xxx.xxx.xxx 1 /ftp/user2/send/BB005908/4_Bild_005.jpg b _ i r user2 ftp 0 * c
Sun Nov 28 04:54:21 2007 0 xxx.xxx.xxx.xxx 2 /ftp/user2/send/BB005908/5_Bild_006.jpg b _ i o user2 ftp 0 * c
Sun Nov 28 04:54:22 2007 0 xxx.xxx.xxx.xxx 3 /ftp/user2/send/BB005908/6_Bild_007.jpg b _ i r user2 ftp 0 * c
Sun Nov 26 04:54:23 2007 0 xxx.xxx.xxx.xxx 1 /ftp/user3/send/BB005908/7_Bild_008.jpg b _ i r user3 ftp 0 * c
Sun Nov 28 04:54:24 2007 0 xxx.xxx.xxx.xxx 1 /ftp/user3/send/BB005908/8_Bild_009.jpg b _ i r user3 ftp 0 * c
Sun Nov 28 04:54:16 2007 0 xxx.xxx.xxx.xxx 90 /ftp/user1/send/BB005908/1_Bild_001.jpg b _ i r user1 ftp 0 * c
Sun Nov 28 04:54:17 2007 0 xxx.xxx.xxx.xxx 100 /ftp/user1/send/BB005908/2_Bild_002.jpg b _ i r user1 ftp 0 * c
Sun Nov 26 04:54:18 2007 0 xxx.xxx.xxx.xxx 100 /ftp/user1/send/BB005908/3_Bild_004.jpg b _ o r user1 ftp 0 * c
Sun Nov 28 04:54:20 2007 0 xxx.xxx.xxx.xxx 4 /ftp/user2/send/BB005908/4_Bild_005.jpg b _ i o user2 ftp 0 * c
Sun Nov 28 04:54:21 2007 0 xxx.xxx.xxx.xxx 10 /ftp/user2/send/BB005908/5_Bild_006.jpg b _ i r user2 ftp 0 * c
Sun Nov 28 04:54:22 2007 0 xxx.xxx.xxx.xxx 30 /ftp/user2/send/BB005908/6_Bild_007.jpg b _ i r user2 ftp 0 * c
Sun Nov 28 04:54:23 2007 0 xxx.xxx.xxx.xxx 1 /ftp/user3/send/BB005908/7_Bild_008.jpg b _ i r user3 ftp 0 * c
Sun Nov 26 04:54:24 2007 0 xxx.xxx.xxx.xxx 1 /ftp/user3/send/BB005908/8_Bild_009.jpg b _ i r user3 ftp 0 * c
Oh, yeah!
Hallo Duff
da klappt noch was nicht folgendes muss nicht auf dem Bildschirm erscheinen. .
200 o
USER: user1\tInput: 0
USER: user1\tOutput: 200
90 i
USER: user1\tInput: 90
USER: user1\tOutput: 200
100 i
USER: user1\tInput: 190
USER: user1\tOutput: 200
User: user1 hat 0 , 0 Bytes empfangen
1 i
USER: user2\tInput: 1
USER: user2\tOutput: 0
Sondern nur die
Gesamtsumme pro User und für i und o
echo "User: $user hat $i , $o Bytes empfangen"
Danke und Gruß
da klappt noch was nicht folgendes muss nicht auf dem Bildschirm erscheinen. .
200 o
USER: user1\tInput: 0
USER: user1\tOutput: 200
90 i
USER: user1\tInput: 90
USER: user1\tOutput: 200
100 i
USER: user1\tInput: 190
USER: user1\tOutput: 200
User: user1 hat 0 , 0 Bytes empfangen
1 i
USER: user2\tInput: 1
USER: user2\tOutput: 0
Sondern nur die
Gesamtsumme pro User und für i und o
echo "User: $user hat $i , $o Bytes empfangen"
Danke und Gruß
wird noch ausgefüllt. . .