Intereting Posts
Выйдите из сценария, если какое-либо утверждение не выполнено OpenVPN борется Как иметь непрерывный онлайн-поток с ffplay? Формат для iname в операции поиска apt-get через ssh-tunnel, если разрешен только порт 22 Почему chmod рекурсивно меняет права доступа к файлам? Заблокировать экран w / slock через определенное время? Мониторинг файлов для предварительного взлома хакера Не удается обновить Scientific Linux до версии 6.5 Могу ли я реплицировать DNS-записи в формате AXFR, если pdns-recursor находится перед авторитетным pdns Как определить точное имя пакета `.so`, чтобы его можно было установить через` zypper`? MacOS X Mavericks, работающий с VirtualBox, не может взаимодействовать с Linux VM отправлять электронную почту с моего локального домена example.com на внешний почтовый сервер с помощью Sendmail Как остановить запущенное приложение от запуска нового экземпляра, если он уже запущен? Разрешения FTP

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

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) 

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

1. Грепинг в 1 переменную

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

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

Это запустит curl 1 time и 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. Чтение в vars от grep

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

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

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

 read var1 var2 <<CURLSED $(curl $url | sed -nr 's/(regx1)\|(regx2)/"\1"'"$IFS"'"\2"/p') CURLSED 

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