Каков наиболее эффективный способ 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) 

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

2 Solutions collect form web for “Каков наиболее эффективный способ grep для двух совершенно разных вещей и присвоения значений отдельным переменным?”

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 

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

  • Использование «$ {a: -b}» для назначения переменных в скриптах
  • Поведение задания массива
  • как получить или отразить имя вызываемой функции bash?
  • Проверьте, содержит ли строка строку подстроки
  • Функция проверки переменной BASH
  • Как присвоить значение переменной, когда значение содержит символ $ в ней
  • Удалить определенное слово в переменной
  • Как использовать расширенное значение переменной оболочки в имени другой переменной?
  • Как сохранить статус последнего выхода после теста
  • перечислить файлы и сохранить их в переменных
  • Как передать переменную в sftp?
  • Interesting Posts

    Увеличение десятичных значений до следующего целого значения

    Как выбрать количество цифр в переменной в моих сценариях?

    Что необходимо для получения электронной почты на субдомене?

    Как использовать sed для выборочного удаления ведущих нулей

    Загрузка DVD KNOPPIX для вывода из командной строки grub

    Не удалось удалить файл

    Как избавиться от приглашения окна двойного цикла в XFCE

    Не удается подключиться к Интернету с помощью карты Realtek Lan RTL8105TA

    любая команда, которая может форматировать html или xml из оболочки?

    Запуск отключения Linux при сбое питания

    Установка ядра по умолчанию в GRUB

    Переименование файла в тот момент, когда он отображается в папке

    Как я могу повлиять на отображение виртуального дисплея (X Server) после загрузки?

    Какой дистрибутив для этой задачи?

    Можно ли «установить» крючок, который будет вызываться перед удалением пакета?

    Linux и Unix - лучшая ОС в мире.