Какой самый эффективный способ выполнить grep для двух совершенно разных вещей и присвоить значения отдельным переменным?

8

CentOS 6.x

Я хочу взять вывод из curl, grep для двух совершенно разных строк и назначить их соответствующие значения в качестве переменных. Каков наиболее эффективный способ сделать это (без записи вывода на диск)?

Обычно я думаю о наличии сценария с чем-то вроде:

#!/usr/bin/env bash
foo1=$(curl https://domain.com/file.xml | grep string1)
foo2=$(curl https://domain.com/file.xml | grep string2)

Но это в итоге делает два прохода и ужасно неэффективно. Есть ли способ лучше? Надеюсь, решение, которое включает в себя меньше проходов?

Майк Б
источник

Ответы:

10

1. Погружение в 1 переменную

Попробуй это:

foo1=$(curl https://domain.com/file.xml | grep -E "string1|string2")

Это будет выполнено curl1 раз и grep для случаев string1или string2.

2. Разбиение на 2 переменные

Если это разные переменные, измените тактику немного. Захватите результат curlи затем grepпотом.

output=$(curl https://domain.com/file.xml)
foo1=$(echo "$output" | grep "string1")
foo2=$(echo "$output" | grep "string2")

3. Поиск в массиве

Вы также можете хранить результаты в массиве вместо отдельных переменных.

output=$(curl https://domain.com/file.xml)
readarray foo < <(echo "$output" | grep "string1|string2")

С этим немного сложно разобраться, если ваши результаты из grep могут не возвращать результаты, так как результаты из «string2» могут быть первым или вторым элементом в массиве, но я предоставляю его здесь просто как демонстрацию подход.

4. Чтение в переменную из grep

Еще один метод, который использует readкоманду вместе с процессом substitution ( <( ..cmd..)).

$ read -d"\n" foo1 foo2 \
   <(curl https://domain.com/file.xml | grep -E "string1|string2")

Это снова может быть сложно, если поиск «string1» ничего не возвращает, в результате чего любые совпадения с «string2» будут отображаться в $foo1. Также этот подход имеет тенденцию быть менее переносимым, чем № 2 или № 3 выше.

SLM
источник
Сожалею! У меня была опечатка. Переменные на самом деле разные. :-( Резюме теперь обновляется.
Майк Б
Вы можете заметить, что замена процесса, которую вы рекомендуете, далека от переносимой опции.
Mikeserv
@mikeserv - спасибо за отзыв, обновлено.
SLM
3
read var1 var2 <<CURLSED
$(curl $url | sed -nr 's/(regx1)\|(regx2)/"\1"'"$IFS"'"\2"/p')
CURLSED

Серьезно, парень, есть миллион способов снять шкуру с этой кошки.

mikeserv
источник