2016-03-29 8 views
1

ich eine ähnliche Abfrage Elasticsearch haben:Wie Sie sich richtig Argumente übergeben GNU parallel in BASH kräuseln mit

printf "${DATES[@]}" | \ 
perl -pne 's/_/\n/g' | \ 
parallel --jobs $i --load 6 curl -s -u user:pass \ 
     -XPOST 'https://127.0.0.1/_search' \ 
     -d "{\"query\":{\"filtered\":{\"query\":{\"query_string\":{\"query\":\"_type:some_logs AND webapp_domain:${DOMAIN}\",\"analyze_wildcard\":false}},\"filter\":{\"bool\":{\"must\":[{\"range\":{\"@timestamp\":{\"gte\":\"{}T00:00:00.001Z\",\"lte\":\"{}T23:59:59.999Z\"}}}],\"must_not\":[]}}}},\"size\":1}" 

Ich habe prodlems mit dem JSON, die übergeben wird:

, wenn ich tun (Doppel qoutes):

-d "query" 

ich:

+ parallel --jobs 4 --load 6 curl -s -u user:pass -XPOST https://127.0.0.1/_search -d '{"query":{"filtered":{"query":{"query_string":{"query":"_type:some_logs AND webapp_domain:www.some.tk","analyze_wildcard":false}},"filter":{"bool":{"must":[{"range":{"@timestamp":{"gte":"{}T00:00:00.001Z","lte":"{}T23:59:59.999Z"}}}],"must_not":[]}}}},"size":1}' 
{"error":"SearchPhaseExecutionException[Failed to execute phase [query], all shards failed; shardFailures {[3YqwKjGDTaKREWzQdxIjzA][%{index_name}][0]: RemoteTransportException[[elasticsearch5][inet[/1.1.1.1:9300]][indices:data/read/search[phase/query]]]; nested: SearchParseException[[%{index_name}][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [query:{filtered:query:{query_string:query:_type:some_logs AND webapp_domain:www.some.tk}}]]]; nested: JsonParseException[Unrecognized token 'query': was expecting ('true', 'false' or 'null')\n at [Source: UNKNOWN; line: 1, column: 7]]; }{[3YqwKjGDTaKREWzQdxIjzA][.jsp][0]: RemoteTransportException[[elasticsearch5][inet[/1.1.1.1:9300]][indices:data/read/search[phase/query]]]; nested: SearchParseException[[.jsp][0]: from[-1],size[-1]: Parse Failure [... 

Wenn ich (Einzel qoutes):

-d 'query' 

ich:

/bin/bash: -c: line 0: `curl -s -u user:pass -XPOST https://172.0.0.1/_search -d {\"query\":{\"filtered\":{\"query\":{\"query_string\":{\"query\":\"_type:some_logs AND webapp_domain:${DOMAIN}\",\"analyze_wildcard\":false}},\"filter\":{\"bool\":{\"must\":[{\"range\":{\"@timestamp\":{\"gte\":\"2016-03-22T00:00:00.001Z\",\"lte\":\"2016-03-22T23:59:59.999Z\"}}}],\"must_not\":[]}}}},\"size\":1}' 
/bin/bash: -c: line 0: syntax error near unexpected token `(' 

So die Termine korrekt aufgefüllt werden, aber die Abfrage der ${DOMAIN} Parameter nicht interpoliert wird. Dies wird erwartet, da der '' den Interpreter anweist, den Stich buchstäblich zu behandeln (keine Interpolation).


FRAGE:

Wie kann und ob ich es tun? Kann ich die ${DATES[@]} 1 auf einmal mit Parallelen übergeben und die ${DOMAIN} aus dem umgebenden Bereich im selben Aufruf übergeben?


UPDATE (2016.03.29) # 1:

Ich hatte einige richtig arbeiten Locken ES von BASH - so provozierte ich den gleichen Fehler zu überprüfen, wie die Abfrage von ES Perspektive sieht. Die Ergebnisse:

Initial Syntax der Abfrage von ES-Protokolle:

[Failed to parse source [query:{filtered:query:{query_string:query:_type:some_logs AND webapp_domain:www.some.tk}}]]]; 

Dies ist, wie die qoutery aussieht, wenn die Anweisung korrekt ausgeführt wird:

[Failed to parse source [{\"query\":{\"filtered\":{\"query\": 

ich sehen, dass es kritische Zeichen fehlt in der Abfrage.

+0

Kann es sein, dass die Weitergabe der Domäne nicht korrekt erfolgt, wenn doppelte Qoutes verwendet werden: 'Fehler beim Analysieren der Quelle [Abfrage: {filtered: query: {query_string: query: _type: some_logs UND webapp_domain: www.some.tk }}]]] '... das ist definitiv nicht korrekt, kann jemand Rat geben? Danke –

Antwort

2

Zitat ist eine Hündin. Quoted double ist eine Doppelschlampe.

Daher schlägt das Handbuch für GNU Parallel vor, eine Funktion zu machen und diese stattdessen auszuführen. Der Vorteil ist, dass Sie die Funktion separat testen können, bevor Sie sie an GNU Parallel übergeben.

In Ihrem Fall ist es so etwas wie aussehen:

mycurl() { 
    time="$1" 
    curl -s -u user:pass \ 
     -XPOST 'https://127.0.0.1/_search' \ 
     -d "{\"query\":{\"filtered\":{\"query\":{\"query_string\":{\"query\":\"_type:some_logs AND webapp_domain:${DOMAIN}\",\"analyze_wildcard\":false}},\"filter\":{\"bool\":{\"must\":[{\"range\":{\"@timestamp\":{\"gte\":\"${time}T00:00:00.001Z\",\"lte\":\"${time}T23:59:59.999Z\"}}}],\"must_not\":[]}}}},\"size\":1}" 
} 
export -f mycurl 

printf "${DATES[@]}" | \ 
perl -pne 's/_/\n/g' | \ 
parallel --jobs $i --load 6 mycurl 

PS: auf $ Je TERMINE Sie in der Lage sein können, GNU Parallel zu gebrauchen -d trennen sie von den Perl-Filter insted.

+0

Großartig. Es funktionierte.Ich habe 'parallel --jobs $ i --laden 6 mycurl {} $ DOMAIN' ... nur aus Neugier gibt es eine Möglichkeit, 2 Parameter zu übergeben, die pro Job (1 Paar für 1 Job) einfach aufgeteilt werden müssen? Someting wie: 'parallel --jobs $ --load i 6 mycurl {} {}' –

+1

eine Stunde verbringen durch das Tutorial zu Fuß. Ihre Befehlszeile wird Sie dafür lieben. 'Man parallel_tutorial' oder http://www.gnu.org/software/parallel/parallel_tutorial.html#GNU-Parallel-Tutorial –

Verwandte Themen