[Shell Script] Daten aus einer Datei lesen und verarbeiten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
plato13
Beiträge: 19
Registriert: 21.08.2007 07:31:30
Wohnort: Kreis Vie

[Shell Script] Daten aus einer Datei lesen und verarbeiten

Beitrag von plato13 » 26.11.2007 12:55:59

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ß
wird noch ausgefüllt. . .

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 26.11.2007 13:01:50

Hört sich für mich eher nach perl an.

Aber mache mal bitte ein Beispiel.
Auszug aus der Log-datei und was du dann als Result haben möchtest.
Oh, yeah!

Benutzeravatar
startx
Beiträge: 3165
Registriert: 07.12.2002 19:29:48
Wohnort: london

Beitrag von startx » 26.11.2007 13:24:01

sed und awk

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: [Shell Script] Daten aus einer Datei lesen und verarbeit

Beitrag von roli » 26.11.2007 13:24:09

Hi,

wie Duff schon sagte Perl koennte die Loesung sein, aber auch awk-sed-shell waere denkbar.
plato13 hat geschrieben:Das Script solle jede Nacht um 00.01 starten
Dafuer gibt's "cron"
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"

Benutzeravatar
plato13
Beiträge: 19
Registriert: 21.08.2007 07:31:30
Wohnort: Kreis Vie

Beitrag von plato13 » 26.11.2007 13:48:53

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ß
wird noch ausgefüllt. . .

Benutzeravatar
startx
Beiträge: 3165
Registriert: 07.12.2002 19:29:48
Wohnort: london

Beitrag von startx » 26.11.2007 13:52:47

1.schritt: du benutzt sed um die byteangaben aus dem logfile rauszuschneidem
und addierst sie in einem bash script.

2. du benutzt cron um festzulegen wann das passiert.

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 26.11.2007 13:55:51

Hi,

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
Das ist jetzt nur so eine Idee auf die schnelle, sollte aber so machbar sein.
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"

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 26.11.2007 16:14:48

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:

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
Beispiel Ausgabe:

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!

Benutzeravatar
plato13
Beiträge: 19
Registriert: 21.08.2007 07:31:30
Wohnort: Kreis Vie

Beitrag von plato13 » 27.11.2007 08:43:25

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ß
wird noch ausgefüllt. . .

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 27.11.2007 09:41:43

expr benötigt man zum Addieren der Werte (expr - evaluate expressions).

Zum Runden der Werte oder zur besseren Übersicht in K, KB oder GB könntest du auch du -h verwenden.
Oh, yeah!

Benutzeravatar
plato13
Beiträge: 19
Registriert: 21.08.2007 07:31:30
Wohnort: Kreis Vie

Beitrag von plato13 » 27.11.2007 11:38:08

Hallo Duff,

vielen Dank werde es später mal testen.

Gruß
wird noch ausgefüllt. . .

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 27.11.2007 12:22:30

Hi,

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"

Benutzeravatar
plato13
Beiträge: 19
Registriert: 21.08.2007 07:31:30
Wohnort: Kreis Vie

Noch eine weitere Frage

Beitrag von plato13 » 28.11.2007 08:54:47

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ß
wird noch ausgefüllt. . .

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 28.11.2007 09:33:29

Frage: Soll dann z.B. für user1 die Summer der Bytes addiert werden, aber zwischen i und o unterschieden werden.

Datei:
...
user1 10 ... i
user1 20 ... i
user2 10 ....i
user1 30 ...o
user1 05 ...i
user1 30 ...o
...

Ausgabe etwa so?:
user1: 45 i
user1: 60 o
user2: 10 i
Oh, yeah!

Benutzeravatar
plato13
Beiträge: 19
Registriert: 21.08.2007 07:31:30
Wohnort: Kreis Vie

Beitrag von plato13 » 28.11.2007 09:37:50

Hallo Duff

also so wäre Klasse

User1 56GB i
User1 23GB o

User2 12GB i
User2 1MB o

usw. usw.

Danke und Gruß
wird noch ausgefüllt. . .

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 28.11.2007 10:33:37

Hallo,

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!

Benutzeravatar
plato13
Beiträge: 19
Registriert: 21.08.2007 07:31:30
Wohnort: Kreis Vie

Beitrag von plato13 » 28.11.2007 12:54:38

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ß
wird noch ausgefüllt. . .

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 05.12.2007 15:08:45

Weiß leider auch nicht so direkt, warum die Variablen nur innerhalb der while-Schleife gültig sind.
Oh, yeah!

Antworten