簡體   English   中英

如何在BASH中使用GNU parallel正確傳遞參數以進行curl

[英]How to correctly pass arguments to curl using GNU parallel in BASH

我有一個與ElasticSearch類似的查詢:

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}"

我對正在傳遞的JSON有問題:

如果我這樣做(雙qoutes):

-d "query"

我得到:

 + 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 [...

如果我這樣做(單個qoutes):

-d 'query'

我得到:

/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 `('

因此,正確地填充了DATES,但是查詢沒有對${DOMAIN}參數進行插值。 可以預期這是因為''指示口譯員按字面意義對待字符串(無內插)。


題:

我該怎么辦,我該怎么辦? 我可以同時使用並行傳遞${DATES[@]} 1並在同一調用中傳遞周圍范圍的${DOMAIN}嗎?


更新(2016-03-29)#1:

我從BASH到ES有一些正常工作的卷發-因此我挑起了同樣的錯誤,從ES角度檢查查詢的外觀。 結果:

ES日志中查詢的初始語法:

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

這是正確執行該語句時qoutery的外觀:

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

我看到查詢中缺少關鍵標志。

報價是個a子。 雙引號是雙bit子。

因此,GNU Parallel手冊建議創建一個函數並運行它。 好處是您可以在將功能提供給GNU Parallel之前單獨對其進行測試。

在您的情況下,它將類似於:

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:根據$ DATES的不同,您也許可以使用GNU Parallel的-d將它們插入perl過濾器中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM