Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Frage Linux Linux Tools

Bash String Array

Mitglied: SIPSIP

SIPSIP (Level 1) - Jetzt verbinden

07.02.2014, aktualisiert 14:14 Uhr, 2442 Aufrufe, 7 Kommentare, 1 Danke

Hallo Leute ich schon wieder
Zur Info: Grund für meine vielen Fragen ist, weil ich ein Projekt bekommen habe und von all dem bis vor kurzem eigentlich keine Ahnung hatte...

Hab da son Bash Scritp mit dem ich aus 96 Datenbanken eine bestimmte Spalte(introtext) auslesen muss und das gesammte Ergebniss in einer CSV Datei speichern soll. Leider haben die Tabellen in der sich die Spalte befindet auch bei jeder DB einen anderen Namen/prefix.

Da es nicht möglich ist in einer mySQL Abfrage im Namen der Tabelle, Variablen zu gebrauchen musste ich die ganze Abfrage in eine Variable packen und diese zuvor mit Funktionien wie String & Array zusammenstellen.

Nun ist das Problem, dass momentan beim ausführen des Scripts, die Abfrage viel zu viel Abfragt.
Das heisst es versucht in jeder Datenbank nach allen 96 Tabellen zu suchen, nur sollte sie das ja nicht da es immer nur 1 richtige gibt... und das ganze dan mal 96 -.-

Als ich das Script erstellte testete ich es mit nur 4 DB's und dementsprechen nur 4 Tabellen. Wobei es nicht alzu schlimm war wen es zu viel arbeitete aber nun dauert das Ausführen des Scripts um die 1.5 Stunden...

Die DB-Namen und Tabellennamen sind in der gleichen Reihenfolge aufgelistet.

Wie kann ich meinem Script sagen das es jeweils nur die richtige DB mit der richtigen Tabelle zusammenstellen soll? sowas wiene Nummerierung...

Hier noch das Script (hab die Tabellen und DBs ein wenig gekürzt^^)

01.
#!/bin/bash 
02.
 
03.
#MySQL Login Variablen 
04.
user=root 
05.
pass=password123 
06.
 
07.
#Tebellenname Variablen 
08.
STRtbl="ebn8r_content,h4akd_content,vbm6h_content,fb2tz_content,x4fve_content,gbty6_content,psf7w_content" 
09.
 
10.
#DB Variablen 
11.
STRDB="DB1,DB2,DB3,DB4,DB5,DB6,DB7" 
12.
 
13.
#String Array für Tabelle in Variable y 
14.
STR_ARRAYtbl=(`echo $STRtbl | tr "," "\n"`) 
15.
echo "loop1 $STR_ARRAYtbl" 
16.
for y in "${STR_ARRAYtbl[@]}" 
17.
do 
18.
 
19.
#MySQL Abfrage Variable 
20.
query="SELECT introtext FROM $y INTO OUTFILE '/tmp/dbexport.csv' LINES TERMINATED BY '\n';" 
21.
 
22.
#String Array für Datebnbanken in Variable x 
23.
STR_ARRAYDB=(`echo $STRDB | tr "," "\n"`) 
24.
echo "loop2 $STR_ARRAYDB" 
25.
for x in "${STR_ARRAYDB[@]}" 
26.
do 
27.
 
28.
#Abfrage zusammenstellen und ausführen 
29.
for table in $(mysql -u$user -p$pass -D$x -Be "SHOW TABLES"); do 
30.
echo "exporting $x" 
31.
echo "mysql -u $user -p$pass -D$x -Be $query" 
32.
mysql -u$user -p$pass -D$x -Be "$query" 
33.
 
34.
echo "[$x]" 
35.
done 
36.
done 
37.
done
Mitglied: ChrFriedel
07.02.2014, aktualisiert um 14:12 Uhr
Öhm... ich hoffe das is nicht das echte root passwort eures Servers... sowas solltest du vielleicht zensieren ;)

Und zur Frage vielleicht wenigstens noch ein Tipp:

Scheinbar heißen die Tabellen ja alle *_content. Ich würde also versuchen den passenden Tabellennamen für die aktuelle DB so zu finden.

So in etwa solltest du fragen können wie die Tabellen der aktuellen DB heissen

SELECT
TABLE_NAME
FROM information_schema.TABLES

Grüße
Bitte warten ..
Mitglied: SIPSIP
07.02.2014 um 14:20 Uhr
Danke für die schnelle Antwort
Zitat von ChrFriedel:

Öhm... ich hoffe das is nicht das echte root passwort eures Servers... sowas solltest du vielleicht zensieren ;)
uups, ganz vergessen aber war nur mein Testsystem^^

So in etwa solltest du fragen können wie die Tabellen der aktuellen DB heissen
SELECT
TABLE_NAME
FROM information_schema.TABLES

Auf diese Wiese hab ich schon meine Nerven verloren, weil sich rausstellte, dass mySQL Variablen im Tabellenname nicht erkennt und so also z.B. $prefix_content als Abfrage benutzt
Bitte warten ..
Mitglied: ChrFriedel
07.02.2014 um 14:26 Uhr
Zitat von SIPSIP:

Danke für die schnelle Antwort
> Zitat von ChrFriedel:
>
> Öhm... ich hoffe das is nicht das echte root passwort eures Servers... sowas solltest du vielleicht zensieren ;)
uups, ganz vergessen aber war nur mein Testsystem^^

> So in etwa solltest du fragen können wie die Tabellen der aktuellen DB heissen
> SELECT
> TABLE_NAME
> FROM information_schema.TABLES

Auf diese Wiese hab ich schon meine Nerven verloren, weil sich rausstellte, dass mySQL Variablen im Tabellenname nicht erkennt und
so also z.B. $prefix_content als Abfrage benutzt

*g* nein ich glaub da hast du was falsch verstanden, ich meinte es anders.

Gesetzt den Fall deine DBs haben jeweils nur eine Tabelle die irgendwas_content heißt würde deine Abfrage ungefähr (sorry ich nutzte sonst nur MSSQL, wenn die Syntax falsch ist dann bitte mal über MySQL like informieren) so aussehen:

SELECT
TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_Name like '%_content'

Das Ergebnis für diese Abfrage wäre dann im Falle deiner DB1 z. B. ebn8r_content

Und in einer 2ten Abfrage fragst du dann explizit nach dem Introtext in der ermittelten Tabelle. Dadurch reduzieren sich deine Abfragen von 96 *96 (welches übrigens auch keine 1,5h dauern sollte) auf 96 * 2

Es geht sicher noch um einiges effizienter aber dieses Vorgehen sollte völlig ausreichen.
Bitte warten ..
Mitglied: SIPSIP
07.02.2014, aktualisiert um 14:31 Uhr
*g* nein ich glaub da hast du was falsch verstanden, ich meinte es anders.

Gesetzt den Fall deine DBs haben jeweils nur eine Tabelle die irgendwas_content heißt würde deine Abfrage ungefähr
(sorry ich nutzte sonst nur MSSQL, wenn die Syntax falsch ist dann bitte mal über MySQL like informieren) so aussehen:

SELECT
TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_Name like '%_content'

Das Ergebnis für diese Abfrage wäre dann im Falle deiner DB1 z. B. ebn8r_content

Und in einer 2ten Abfrage fragst du dann explizit nach dem Introtext in der ermittelten Tabelle. Dadurch reduzieren sich deine
Abfragen von 96 *96 (welches übrigens auch keine 1,5h dauern sollte) auf 96 * 2

Es geht sicher noch um einiges effizienter aber dieses Vorgehen sollte völlig ausreichen.

Okay ehm... versteh ich das richtig, dann müsste ich diese Abfrage die du oben gennant hast 96 mal separat scheiben?
Bitte warten ..
Mitglied: ChrFriedel
07.02.2014, aktualisiert um 14:38 Uhr
Zitat von SIPSIP:

> *g* nein ich glaub da hast du was falsch verstanden, ich meinte es anders.
>
> Gesetzt den Fall deine DBs haben jeweils nur eine Tabelle die irgendwas_content heißt würde deine Abfrage
ungefähr
> (sorry ich nutzte sonst nur MSSQL, wenn die Syntax falsch ist dann bitte mal über MySQL like informieren) so aussehen:
>
> SELECT
> TABLE_NAME
> FROM information_schema.TABLES
> WHERE TABLE_Name like '%_content'
>
> Das Ergebnis für diese Abfrage wäre dann im Falle deiner DB1 z. B. ebn8r_content
>
> Und in einer 2ten Abfrage fragst du dann explizit nach dem Introtext in der ermittelten Tabelle. Dadurch reduzieren sich
deine
> Abfragen von 96 *96 (welches übrigens auch keine 1,5h dauern sollte) auf 96 * 2
>
> Es geht sicher noch um einiges effizienter aber dieses Vorgehen sollte völlig ausreichen.

Okay ehm... versteh ich das richtig, dann müsste ich diese Abfrage die du oben gennant hast 96 mal separat scheiben?

Natürlich nicht Das wäre ja völlig gegen den Sinn der Automation. Das % ist ein Platzhaltersymbol.

Die Abfrage bedeutet also in etwa:

Liebe DB zu der ich gerade verbunden bin, nenne mir doch bitte mal alle Tabellen in dir deren Name mit "_content" endet. Die Datenbank liefert dir dann alle Namen zurück die passen, und wenn es nur eine Tabelle gibt die auf _content endet dann erhälst du den vollständigen Namen dieser Mit diesem Namen kannst du dann eine 2te Abfrage nach dem Introtext formulieren.
Bitte warten ..
Mitglied: SIPSIP
07.02.2014, aktualisiert um 14:42 Uhr
Natürlich nicht Das wäre ja völlig gegen den Sinn der Automation. Das % ist ein Platzhaltersymbol.

Die Abfrage bedeutet also in etwa:

Liebe DB zu der ich gerade verbunden bin, nenne mir doch bitte mal alle Tabellen in dir deren Name mit "_content" endet.
Die Datenbank liefert dir dann alle Namen zurück die passen, und wenn es nur eine Tabelle gibt die auf _content endet dann
erhälst du den vollständigen Namen dieser Mit diesem Namen kannst du dann eine 2te Abfrage nach dem Introtext
formulieren.

Also ist das eine Ergänzung zu meinem Scritp oder? weil ich ja eigentlich nur eine Spalte will...
Bitte warten ..
Mitglied: SIPSIP
13.02.2014 um 09:21 Uhr
Also hab mein Script nun erweitert, leider funktioniert das durchzählen um die passende Tabelle mit der dazugehörigen DB zusammen zu stellen noch nicht.
Vielleicht könnt ihr mir ja weiterhelfen...

01.
#!/bin/bash 
02.
 
03.
#MySQL Login Variablen 
04.
user=root 
05.
pass=pwd123 
06.
 
07.
#Tebellenname Variablen 
08.
STRtbl="ebn8r_content,h4akd_content,vbm6h_content,fb2tz_content" 
09.
 
10.
#DB Variablen 
11.
STRDB="DB1,DB2,DB3,DB4" 
12.
 
13.
counter=0 
14.
countermax=95 
15.
 
16.
#IFS=',' read -a ARRAYdb <<< "$STRDB" 
17.
#IFS=',' read -a ARRAYtbl <<< "$STRtbl" 
18.
IFS="," 
19.
ARRAYdb=($STRDB) 
20.
ARRAYtbl=($STRtbl) 
21.
 
22.
while [ $counter -le $countermax ] 
23.
do 
24.
 
25.
#Entfernt Counter von Tabellenname 
26.
tblcount=$ARRAYtbl[$counter] 
27.
tbl=${tblcount%[*} 
28.
 
29.
#Entfernt Counter von DB-Namen 
30.
dbcount=$ARRAYdb[$counter] 
31.
db=${dbcount%[*} 
32.
        echo "$dbcount" 
33.
#MySQL Abfrage Variable 
34.
query="SELECT introtext FROM $tbl INTO OUTFILE '/tmp/$db.csv' LINES TERMINATED BY '\n';" 
35.
 
36.
#echo "$query" 
37.
        echo "Counter= $counter" 
38.
#Abfrage zusammenstellen und ausführen 
39.
for table in $(mysql -u$user -p$pass -D$db -Be "SHOW TABLES"); do 
40.
        echo "exporting $db" 
41.
mysql -u$user -p$pass -D$db -Be "$query" 
42.
 
43.
counter=$[$counter +1] 
44.
 
45.
        echo "$ARRAYdb[$counter]" 
46.
done 
47.
done 
48.
        echo "Export abgeschlossen"
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Hochkomma im String vom Bash shell
Frage von OIOOIOOIOIIOOOIIOIIOIOOOBatch & Shell7 Kommentare

Hallo an alle, ich suche eine Möglichkeit einen Vollständigen Befehl in String zur verpacken. Ja ich könnte es da ...

Batch & Shell
String mit Zeilenumbruch per Bash ersetzen
gelöst Frage von StefanKittelBatch & Shell1 Kommentar

Hallo, ich möchte gerne in einer Datei einen String durch einen anderen ersetzen. Das dumme daran ist, dass ein ...

Batch & Shell
PowerShell Array Elements zum String
gelöst Frage von derhoeppiBatch & Shell1 Kommentar

Hallo, ich stehe vor folgender Herausforderung. Nachdem ich nun erfolgreich zwei Arrays vergleichen kann in dem ganze Zahlen stecken, ...

Debian
Bash - String zwischen zwei Kommata ausgeben
gelöst Frage von plutowitschDebian3 Kommentare

Hallo, ich suche eine Möglichkeit wie ich einen String der zwischen zwei Kommata steht ausgeben kann. Das Problem ist, ...

Neue Wissensbeiträge
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 2 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 2 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 2 TagenSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 2 TagenSicherheit10 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
E-Mail
Erfahrungen mit hMailServer gesucht
Frage von it-fraggleE-Mail10 Kommentare

Hallo, meine neue Stelle möchte einen eigenen Mailserver. Ich als Linuxkind war direkt geistig mit Postfix dabei. Leider wollen ...

Entwicklung
VBS: alle PDF-Dateien in einem Ordner gleichzeitig öffnen
gelöst Frage von JuweeeEntwicklung9 Kommentare

Hallo, ich habe in deiner Ordnerstruktur (.\Tagesberichte\xx.18\) mehrere dynamische PDF-Formulare (mit LCD erstellt). Die Berichtsformulare sind im Layout alle ...

Firewall
Penetrationstester-Labor - Firewalls
Frage von Oli-nuxFirewall9 Kommentare

Mich würde interessieren warum man beim Einrichten eines Penetrationstester-Labor (VMs) die Firewall der Systeme deaktivieren soll? Hat das nur ...

Netzwerkgrundlagen
IPv6 Inter-VLAN Routing
gelöst Frage von clSchakNetzwerkgrundlagen8 Kommentare

Hi ich befasse mich gerade mit der Implementierung von IPv6 was bisher (in einem VLAN) korrekt funktioniert inkl. DNS ...