Mit Bash-Skript einen Datensatz auslesen?

F

flugopa

Bin gerade dabei ein paar Schritte mit MySQL zu unternehmen.
Das auslesen von Datensätzen per Hand funktionniert.
Wie kann ich aber einen Datensatz per Skript auslesen?
Ein sqldump erstellen und dann auslesen (greppen) finde ich nicht optimal.

Code:
Mysql-Ver. 5.0.77

Code:
mysql> show tables;
+---------------------+
| Tables_in_menagerie |
+---------------------+
| event               | 
| haustier            | 
| pet                 | 
+---------------------+
3 rows in set (0.00 sec)

mysql> DESCRIBE event;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| name   | varchar(20)  | YES  |     | NULL    |       | 
| date   | date         | YES  |     | NULL    |       | 
| type   | varchar(15)  | YES  |     | NULL    |       | 
| remark | varchar(255) | YES  |     | NULL    |       | 
+--------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
#Datenbank-Quelle: SUN
mysql> select * from event;
+----------+------------+----------+-----------------------------+
| name     | date       | type     | remark                      |
+----------+------------+----------+-----------------------------+
| Fluffy   | 1995-05-15 | litter   | 4 kittens, 3 female, 1 male | 
| Buffy    | 1993-06-23 | litter   | 5 puppies, 2 female, 3 male | 
| Buffy    | 1994-06-19 | litter   | 3 puppies, 3 female         | 
| Chirpy   | 1999-03-21 | vet      | needed beak straightened    | 
| Slim     | 1997-08-03 | vet      | broken rib                  | 
| Bowser   | 1991-10-12 | kennel   | NULL                        | 
| Fang     | 1991-10-12 | kennel   | NULL                        | 
| Fang     | 1998-08-28 | birthday | Gave him a new chew toy     | 
| Claws    | 1998-03-17 | birthday | Gave him a new flea collar  | 
| Whistler | 1998-12-09 | birthday | First birthday              | 
+----------+------------+----------+-----------------------------+
10 rows in set (0.00 sec)

Code:
#!/bin/bash
...
echo "Name: $name wurde am ...."
...

Evtl. mit PHP?
 
Ich persönlich bevorzuge ja Perl mit dem Modul DBIx::DWIW für's MySQL-Handling auf der Konsole. PHP hat imo nichts auf der Konsole zu suchen. Das ist eine Webscripting-Sprache und macht erfahrungsgemäss auf der Konsole nur Probleme, von der schlechten Performance mal ganz abgesehen.

Aber zur Not geht das auch mit der Bash. Siehe dazu auch 'man mysql'

Code:
       You can execute SQL statements in a script file (batch file) like this:

          shell> mysql db_name < script.sql > output.tab

Den Output kannst du dann mit sed, awk & Co. weiterverarbeiten.
 
Ich habe mal eine Zeit lang den Speicherverbrauch von meinem vServer geloggt, um zu sehen ob dieser ausreicht. Das habe ich so gemacht:
Code:
#!/bin/bash

-- snip --

echo "insert into ram_average set date=NOW(), ram='$ram', swap='$swap'" | mysql -u $user -p$password $dbname
Das könnte man auch umgekehrt machen. Also auslesen, und nicht eingeben.
Code:
#!/bin/bash
RESULT=$(echo "select * from foo" | mysql -u $user -p$password $dbname)
Und das müsste man halt mit awk, sed, usw weiter verarbeiten.
 
Das wäre dann die "Umkehrung" des Beispiels aus der Manpage. :)
 
Hallo sim4000;

vielen Dank für Deine Unterstützung.

Das Ergebnis enthält noch Fehler.
z.B: 1998-08 zeigt alle Einträge von 1998

Code:
#!/bin/bash
echo -e "\nWelcher Begriff wird gesucht? \c"
read swort
RESULT=$(echo "SELECT * FROM event WHERE MATCH (date) AGAINST ('+"$swort"' IN BOOLEAN MODE)" | mysql menagerie)
echo "$RESULT"
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Hallo bitmuncher;

hast Du evtl. paar brauchbare Perlwebseiten für mich mit praktischen Beispielen.
(evtl. werde ich mich wieder in Perl einarbeiten)
Was ich in Zukunft machen will: Monitorseiten nach meinen Bedarf.
Ich weiss nicht, wo genau der Vorteil von Perl gegenüber der Bash liegt?
Geschwindigkeit? Ist Perl schneller als Bash?

Bitte nicht falsch verstehen. Perl ist sicherlich eine mächtige Skriptsprache, wenn man sie verstanden hat.
 
Zuletzt bearbeitet von einem Moderator:
Wenn du eh Bash gewohnt bist, dann bleib ruhig dabei. Wirkliche Vorteile hat Perl nicht unbedingt, ausser dass man anstatt mit Programmen mit Modulen arbeitet, wodurch weniger Prozesse ge'fork't werden müssen, was etwas Rechenleistung spart und geringfügig schneller ist, was aber auf modernen Rechnern kaum noch zum Tragen kommt.

Wenn du dir das Ganze in Perl doch mal anschauen willst, dann hilft dir die Doku zu DBIx::DWIW sicherlich weiter. Dort sind auch einige Beispiele drin. Ein einfaches Komplettbeispiel:

Code:
#!/usr/bin/perl

use DBIx::DWIW;

print "Welches Wort wird gesucht? ";
my $input = <STDIN>; # einlesen der Eingabe von stdin
chomp($input); # Zeilenumbruch entfernen

# Verbindung zur Datenbank aufbauen

# hier die entsprechenden Werte für die Verbindung zur MySQL eintragen
my $db_user = "meinbenutzer"; # Benutzername für den Login auf der MySQL
my $db_pass = "meinpasswort"; # Passwort für den Login auf der MySQL
my $db_host = "localhost"; # Hostname/Domain des MySQL-Servers
my $db_name = "meinedb"; # Datenbank, auf der wir arbeiten

# Verbindung initialisieren
my $db_conn = DBIX::DWIW->Connect(DB => $db_name, User => $db_user, Pass => $db_pass, Host => $db_host);

# Query zusammenbauen
my $query = "SELECT gewuenschtes_feld FROM meinetabelle where durchsuchtes_feld = '".$input."'";

# Query absetzen und alle Ergebnisse in einem Array ablegen
my @results = $db_conn->FlatArray($query);

# durch das Array gehen und die Ergebnisse ausgeben
foreach my $curr_result (@results) {
  print $curr_result."\n";
}

In welcher Form man sich hier die Ergebnisse ausgeben lässt, hängt davon ab, was man als Rückgabe von der DB erwartet. Ist es jeweils nur ein Tabellenfeld, dann packt man diese in ein Array. Sind es ganze Datensätze mit mehrere Tabellenfelder, kann man '$db_conn->Hashes($query)' verwenden und erwartet man nur ein einzelnes Feld als Ergebnis, dann nutzt man einfach '$db_conn->Scalar($query)'. Siehe dazu aber auch die oben erwähnte Doku.

Da du aber ja selbst sagst, dass du kein Perl kannst, ist es sicherlich sinnvoller, wenn du bei der Sprache bleibst, die du kannst und einfach in deinem Skript den Fehler behebst. Lass dir z.B. mal das generierte Query ausgeben und gebe es so in einen MySQL-Client ein um zu sehen, ob du die gewünschten Ergebnisse bekommst. Wenn nicht, dann ist etwas am Query falsch, was dann zumeist auch offensichtlicher wird, wenn du siehst, wie das generierte Query aussieht.
 
Hallo bitmuncher,

Danke für die Info.

Frage: Mit welchen Skripten (ich nehme mal an das es Perl ist) überwachst Du Deine Server?
Temp.,Space,Error-Log,Traffic,etc.

Kann man mit Perl feststellen welcher Benutzer gerade welches File bearbeitet bzw. geöffnet hat? (Unter Samba ist es smbstatus)
 
Ich monitore meine Server mit diversen Programmen. Ob ich Perl einsetze oder andere Sprachen, kommt auf die Situation an. Wenn die Überwachung durch Nagios läuft, setze ich natürlich Perl ein. Offene Dateien z.B. überwache ich aber mit einem kleinen Daemon, der ähnlich wie lsof funktioniert und durch ein Kernel-Modul versteckt wird. Änderungen an Dateien registriert ein kleines Cron-Skript, das die MD5-Summen regelmässig prüft. Performance-Daten werden mit Munin gesammelt und Programmausfälle werden von Nagios und Monit registriert.

Aber natürlich kann man auch Perl nutzen um festzustellen, welche Dateien von wem geöffnet sind. Dafür gibt es z.B. Unix::Lsof. Auch für Samba gibt es da sicherlich was vergleichbares. Ich muss mich mit Samba glücklicherweise nicht rumärgern und kann dir daher dafür keine Lösung anbieten. Mir ist eh unklar, warum man hinter ein Windows-Netzwerk einen Samba anstatt einen Windows-Server setzen sollte. Siehe aber einfach http://search.cpan.org/search?query=samba&mode=all um zu sehen was Perl mit Samba alles machen kann.
 
Hallo bitmuncher,

ich muss gestehen das Perl sehr leise, aber doch stetig gewachsen ist.
Mein erstes Perlprogramm (in den 90er: syslog (514 udp)) zur Erfassung von Trafficinfo mehrere Router.
Darin besteht auch ein wesentlicher Unterschied zw. Bash und Perl: Deamon
zu schreiben.

Ich werde Perl im Auge behalten. Versprochen!
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

@bitmuncher;
Mir ist eh unklar, warum man hinter ein Windows-Netzwerk einen Samba anstatt einen Windows-Server setzen sollte.
Ein möglicher Grund:
Weil das Geld für ein echten Windowsserver fehlt.
 
Zuletzt bearbeitet von einem Moderator:
Die Frage gabs schonmal und ich hatte auch mal ne kleine Funktion dazu gepostet. Schau mal hier
 

Ähnliche Themen

Doppelte Einträge vermeiden, aber wie?

Mit awk ein textfile parsen und SQL daraus erzeugen.

NagiosGrapher 1.7.1 funktioniert nicht

Mysteriöser 11.4 Absturz - Maschine läuft, SSH und vor Ort Login unmöglich

Rollei Mini Wifi Camcorder

Zurück
Oben