per Bash in MySQL einlesen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mod3

per Bash in MySQL einlesen

Beitrag von mod3 » 05.03.2012 14:34:59

Hey Leute!

Habe ein Logfile in folgender Form vorliegen:

Code: Alles auswählen

2012/03/04 12:35:52 (::ffff:192.168.0.2) user1
2012/03/04 12:29:52 (::ffff:192.168.0.15) user5
2012/03/04 12:47:52 (::ffff:192.168.7.8) user3
2012/03/04 12:54:52 (::ffff:192.168.8.12) user9
...
Dieses möchte ich nun in MySQL einlesen, wobei ich schon eine passende Datenbank mit einer Tabelle angelegt habe.
Eingelesen werden soll das ganze dann natürlich zeilenweise, wobei die Spalten von links nach rechts folgendermaßen benannt sind:

id, datum, uhrzeit, ip, user

Wie ich das von Hand eintragen würde ist mir klar, nur wie automatisiere ich sowas in einem Batch-Skript?
Wie bekomme ich es außerdem hin, dass die IDs hochgezählt werden?

Grüße
mod3

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: per Bash in MySQL einlesen

Beitrag von Cae » 05.03.2012 14:57:25

mod3 hat geschrieben:Wie ich das von Hand eintragen würde ist mir klar, nur wie automatisiere ich sowas in einem Batch-Skript?
Wie bekomme ich es außerdem hin, dass die IDs hochgezählt werden?
Naja, du kannst mit so einer Konstruktion etwas an mysql weitergeben:

Code: Alles auswählen

( echo foo
  echo bar
  echo quit
) | mysql
Das ist dann genau so, als würdest du die Befehle von Hand eintippen. Für die IDs würde ich autoincrement empfehlen, das wird schon bei der Erstellung der Tabelle festgelegt und danach ignoriert (weil es automatisch inkrementiert wird).

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

mod3

Re: per Bash in MySQL einlesen

Beitrag von mod3 » 05.03.2012 15:00:15

Ok, und wie bekomme ich es damit hin, einfach die ganze Datei bis zum EOF (end of file) einzulesen?
Denn so muss ich die Werte ja tatsächlich noch von Hand angeben, oder?

Wie ist's mit dem Ansatz, das Logfile per awk auszulesen und dann die einzelnen Spalten in die Spalten einer Datenbank einzutragen?
Ist bloß extrem viel Tipparbeit, das geht doch bestimmt einfacher?

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: per Bash in MySQL einlesen

Beitrag von Cae » 05.03.2012 15:39:00

mod3 hat geschrieben:Wie ist's mit dem Ansatz, das Logfile per awk auszulesen und dann die einzelnen Spalten in die Spalten einer Datenbank einzutragen?
Doch, so würde ich das machen. Da mag es auch bessere Ansätze geben, aber ich finde den hier lustig.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

mod3

Re: per Bash in MySQL einlesen

Beitrag von mod3 » 05.03.2012 16:01:43

Also ich habe nun folgendes zusammengebaut:

Code: Alles auswählen

log="logfile.log"

while read test
do

DATUM=`cat $log | awk '{print $1}'`
UHRZEIT=`cat $log | awk '{print $2}'`
RECHNER=`cat $log | awk '{print $3}'`
USER=`cat $log | awk '{print $4}'`


echo $DATUM $UHRZEIT $RECHNER $USER


mysql -u root -p -D logs --execute="INSERT INTO samba ( datum , uhrzeit, rechner, user ) VALUES ( \"$DATUM\", \"$UHRZEIT\", \"$RECHNER\", \"$USER\" );"

done < $log

Das ist aber noch fehlerbehaftet, da alles in die erste Spalte der Datenbank geschrieben wird...

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: per Bash in MySQL einlesen

Beitrag von Cae » 05.03.2012 16:11:54

Funktioniert der mysql-Aufruf, wenn du ihn manuell mit Werten befüllt (auch mit den escapten "!) abschickst?
Ah, und noch was: wenn du schon mit read das Log in Zeilen aufspaltest, solltest du sie auch verwenden:

Code: Alles auswählen

#!/bin/sh
# …
while read line; do
  datum=$(echo "$line" | awk '{print $1}')
  # …
Im Prinzip kann man auch rein mit awk die Zeilen durchlaufen; Frage in die Runde: wie bekommt man die unterschiedlichen Ausgabekanäle gehandelt? CSV-like als ein String über stdout?

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

mod3

Re: per Bash in MySQL einlesen

Beitrag von mod3 » 05.03.2012 16:25:01

Ah super, jetzt funktioniert es ;-)
Habe lediglich die Syntax von read falsch verwendet und statt "cat" muss man natürlich "echo" nutzen...

Danke!

Methusalix

Re: per Bash in MySQL einlesen

Beitrag von Methusalix » 06.03.2012 01:28:19

Hallo,

da Deine Ausgangsdaten einen csv-Charakter haben, bietet sich vielleicht auch ein direkter
Zugriff von MySql mit mysqlimport an. Näheres dazu siehe hier:
http://dev.mysql.com/doc/refman/5.0/en/mysqlimport.html

Gruß M.

Antworten