2016-07-25 9 views
1
for x in $(cat raw_tables.txt) 
do 
echo '{ 
    "type" : "jdbc", 
    "jdbc" : { 
     "url" : "jdbc:mysql://localhost:3306/test", 
     "user" : "root", 
     "password" : "<pass>", 
     "sql" : "select * from "'$x'"", 
     "elasticsearch" { 
       "cluster" : "Search", 
       "host": "<ip>", 
       "port": 9300 
     }, 
     "index" : ""'$x'"", 
     "type": ""'$x'"" 
    } 
}' | java \ 
    -cp "/etc/elasticsearch/elasticsearch-jdbc-2.3.3.1/lib/*" \ 
    -Dlog4j.configurationFile=/etc/elasticsearch/elasticsearch-jdbc-2.3.3.1/bin/log4j2.xml \ 
    org.xbib.tools.Runner \ 
    org.xbib.tools.JDBCImporter 


cat raw_tables.txt 
table1 
table2 
table3 

Wenn ich laufe, dass es alsFlucht doppelte Anführungszeichen in einem einzigen Zitat

kommt

„index“: „“ $ x „“,

Ich brauche es als „Index“ zu kommen : "$ x", Ich kann das doppelte Zitat, das es produziert, nicht umgehen und wenn ich versuche, die ganze Sache mit einem einfachen Zitat zu umgehen, denkt das Skript, dass es aufgehört hat.

Ich habe versucht, alles .. Alles, was würde geschätzt

Vielen Dank!

+0

warum nicht eines der Anführungszeichen in jedem Paar entfernen? '..." index: ":" $ x '"' ...' – karakfa

+0

Was meinst du? Wie entfernen Sie die Anführungszeichen? Wie gesagt, würde das Skript denken, dass das Skript beendet ist, wo die Variable ist. –

+0

Nein, Sie sind in einfachen Anführungszeichen, double quote ist nur ein beliebiger anderer char in diesem Kontext. – karakfa

Antwort

2

Verwenden Sie ein hier-Dokument, auf diese Weise müssen Sie über zitierte kümmern sich nicht (in diesem Fall, da das Dokument keine Backticks oder Dollar-Zeichen enthalten muss):

while read x; do 
    java ... lots of options \ 
    more options for java \ 
    and more options for java <<END_DOC 
{ 
    "type" : "jdbc", 
    "jdbc" : { 
     "url" : "jdbc:mysql://localhost:3306/test", 
     "user" : "root", 
     "password" : "<pass>", 
     "sql" : "select * from $x", 
     "elasticsearch" { 
       "cluster" : "Search", 
       "host": "<ip>", 
       "port": 9300 
     }, 
     "index" : "$x", 
     "type": "$x" 
    } 
} 
END_DOC 
done <raw_tables.txt 

Die Endmarker (END_DOC in diesem Fall) muss bündig nach links sein, ohne Einrückung.

+0

Das Plugin, das ich verwende, ist JDBC-Importer, der alle Tabellen in der TXT-Datei nach Elasticsearch importiert. Die Entwickler haben Echo '{}' in ihrer Dokumentation verwendet und ich habe nur gesehen, dass es so benutzt wird. Ich habe versucht, Echo und das einfache Zitat zu einem doble Zitat zu entfernen, aber es funktioniert nicht. Ich habe den Code aktualisiert, um die Java-Anwendung anzuzeigen, an die das Echo gesendet wird. –

+0

@AlexRieker Meine Antwort aktualisiert. – Kusalananda

+0

Der Code selbst ausgeführt, aber das einzige Problem ist es, den gesamten Code auf einmal auszuführen.Das heißt, es hat super geklappt, aber könntest du es so machen, dass jedes Skript einzeln nacheinander ausgeführt wird? –

1

hier gehen Sie, entfernen Sie eine der doppelten Anführungszeichen in jedem Paar um $x

$ for x in table1 table2 table2; do 
> echo 'bla bla bla 
>  "index" : "'$x'" 
>  bla bla bla' 
> done 
bla bla bla 
     "index" : "table1" 
     bla bla bla 
bla bla bla 
     "index" : "table2" 
     bla bla bla 
bla bla bla 
     "index" : "table2" 
     bla bla bla 
+0

Wie ich schon sagte, wird das Skript denken, dass die erste Variable das Ende des Skripts ist. –

+0

Dies ist ein echter Lauf und das Skript dachte nicht. Welche Art von System verwenden Sie? Hast du das überhaupt versucht? Bash lässt den einfachen Zitatkontext allein. Daher werden doppelte Anführungszeichen im Skript genauso behandelt wie andere Zeichen. Es besteht keine Notwendigkeit, sie zu verdoppeln oder zu entkommen. Vielleicht habe ich die Frage missverstanden. Soll das '$ x' durch Werte in der for-Schleife ersetzt werden oder buchstäblich als' $ x' zurückgelassen werden? Wenn ja, aus welchem ​​Grund ist die for-Schleife? – karakfa

2

Sie sollten nicht versuchen dynamische JSON wie diese zu erzeugen, da Sie nicht in den Inhalt, wenn etwas wissen von x muss maskiert werden (obwohl in diesem Fall ein gültiger SQL-Tabellenname wahrscheinlich keine spezielle Behandlung benötigt). Sie sollten etwas wie jq verwenden, um stattdessen den JSON zu generieren.

# This is not JSON itself; it is a filter to be used by jq 
# to *generate* JSON. 
template='{ 
     "type" : "jdbc", 
     "jdbc" : { 
      "url" : "jdbc:mysql://localhost:3306/test", 
      "user" : "root", 
      "password" : "<pass>", 
      "sql" : "select * from \($table)", 
      "elasticsearch": { 
      "cluster" : "Search", 
      "host": "<ip>", 
      "port": 9300 
      }, 
      "index" : $table, 
      "type": $table 
     } 
     }' 

while IFS= read -r x; do 
    jq -n --arg table "$x" "$template" | java ... 
done < raw_tables.txt 

jq Verwendung löst viele der gleichen zitieren Probleme, die ein hier Dokument als auch der Fall ist.

Sie können die Tabellennamen auch aus der Standardeingabe lesen, anstatt sie als JSON-Variable zu übergeben. Sie ersetzen $table durch . in der Vorlage, dann rufen Sie jq mit der -R Option anstelle der --arg Option.

template='{ 
    "type" : "jdbc", 
    "jdbc" : { 
     "url" : "jdbc:mysql://localhost:3306/test", 
     "user" : "root", 
     "password" : "<pass>", 
     "sql" : "select * from \(.)", 
     "elasticsearch": { 
     "cluster" : "Search", 
     "host": "<ip>", 
     "port": 9300 
     }, 
     "index" : ., 
     "type": . 
    } 
    }' 

while IFS= read -r x; do 
    echo "$x" | jq -R "$template" | java ... 
done < raw_tables.txt 
+0

Hallo, ich versuche andere Lösungen und ich versuche deine jetzt und es ist Pick-Up-Compling-Fehler. 2 kompilieren Fehler ^ Cerror: Syntaxfehler, unerwartete '{', erwartet '}' \t "Elasticsearch" { ^ Fehler: Syntaxfehler, unerwartete '}', erwartet $ –

+0

Ihre ursprüngliche JSON Ende in die Frage ist, fehlt das ':' nach dem "elasticsearch" Schlüssel. – chepner

+1

OMG DANKE SO VIEL. Jetzt funktioniert die andere Lösung. –

Verwandte Themen