Как сохранить вывод curl в нескольких переменных в Bash - PullRequest
1 голос
/ 23 марта 2020

В моем скрипте у меня есть два http-запроса. Я хотел бы повторно использовать соединение, поэтому, например, что я делаю:

curl -v 'http://example.com?id=1&key1=value1' 'http://example.com?id=1&key2=value2'

Есть ли способ сохранить выходные данные каждого запроса http в двух разных переменных? Я искал. Я не нашел никакого решения.

Я понимаю, что могу сделать следующее, чтобы сохранить выходные данные в двух разных файлах.

curl -v 'http://example.com?id=1&key1=value1' -o output1 'http://example.com?id=1&key2=value2' -o output2

Редактировать: вот мой пример использования

У меня есть cronjob, который запускает команду параллельного (GNU параллельно) ниже каждые несколько минут. И 'get_data. sh' будет выполняться 2000 раз, потому что в input.csv есть 2000 строк. Я бы не хотел использовать файл tmp для достижения максимальной производительности.

parallel \
  -a input.csv \
  --jobs 0 \
  --timeout $parallel_timeout \
  "get_data.sh {}"

В get_data. sh:

id=$1
curl -v "http://example.com?id=${id}&key1=value1" -o output1 \
"http://example.com?id=${id}&key2=value2" -o output2

stat1=$(cat output1 | sed '' | cut ..)
stat2=$(cat output2 | awk '')

Ответы [ 2 ]

2 голосов
/ 29 марта 2020

Вы ищете parset. Он является частью env_parallel, являющейся частью пакета GNU Parallel (https://www.gnu.org/software/parallel/parset.html):

parset myarr \
  -a input.csv \
  --jobs 0 \
  --timeout $parallel_timeout \
  get_data.sh {}

echo "${myarr[3]}"

Вы можете parset запускать все комбинации - так же, как и вы с GNU Parallel:

echo www.google.com > input.txt
echo www.bing.com >> input.txt

# Search for both foo and bar on all sites
parset output curl https://{1}/?search={2} :::: input.txt ::: foo bar

echo "${output[1]}"
echo "${output[2]}"

Если вы выполняете различную обработку для foo и bar, вы можете создавать функции и запускать их:

# make all new functions, arrays, variables, and aliases defined after this
# available to env_parset
env_parallel --session

foofunc() {
  id="$1"
  curl -v "http://example.com?id=${id}&key1=value1" | sed '' | cut -f10
}

barfunc() {
  id="$1"
  curl -v "http://example.com?id=${id}&key2=value2" | awk '{print}'
}

# Run both foofunc and barfunc on all sites
env_parset output {1} {2} ::: foofunc barfunc :::: input.txt

echo "${output[1]}"
echo "${output[2]}"
env_parallel --end-session

--(end-)session и env_parset необходимы, если вы не хотите export -f функций и переменных, которые вы используете в функциях.

GNU Parallel использует временные файлы. Если ваша команда выполняется быстро, то эти временные файлы никогда не касаются диска до их удаления. Вместо этого они остаются в кеше диска в оперативной памяти. Вы даже можете заставить их оставаться в оперативной памяти, указав --tmpdir на виртуальный диск:

mkdir /dev/shm/mydir
parset output --tmpdir /dev/shm/mydir ...
0 голосов
/ 26 марта 2020

Хорошо, вот что вдохновляет:

id=$1
output1=$(curl -v "http://example.com?id=${id}&key1=value1")
output2=$(curl -v "http://example.com?id=${id}&key2=value2")

stat1=$(echo "$output1" | sed '' | cut ..)
stat2=$(echo "$output2" | awk '')

Таким образом, вы избегаете записи чего-либо на диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...