Qual é a maneira mais eficiente de fazer duas coisas completamente separadas e atribuir os valores a variáveis separadas?

8

CentOS 6.x

Eu quero pegar a saída de curl, grep para duas strings completamente separadas e atribuir seus respectivos valores como variáveis. Qual é a maneira mais eficiente de fazer isso (sem gravar a saída para o disco)?

Normalmente, eu pensaria em ter um script com algo como:

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

Mas isso acaba levando dois passes e é terrivelmente ineficiente. Existe uma maneira melhor? Espero que uma solução que envolve menos passes?

    
por Mike B 04.03.2014 / 03:06

2 respostas

10

1. Grepping em 1 variável

Tente isto:

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

Isso executará curl 1 hora e grep para ocorrências de string1 ou string2 .

2. Entrando em 2 variáveis

Se forem variáveis diferentes, mude ligeiramente de tática. Capture a saída de curl e depois grep .

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

3. Grepping em uma matriz

Você também pode armazenar os resultados em uma matriz em vez de variáveis separadas.

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

Este é um pouco complicado se os resultados do grep não retornarem resultados, já que os resultados de "string2" podem ser o primeiro ou o segundo item da matriz, mas estou fornecendo aqui da mesma forma que uma demonstração da abordagem.

4. Lendo em vars do grep

Ainda outro método que faz uso do comando read junto com a substituição do processo ( <( ..cmd..) ).

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

Novamente, isso pode ser complicado se a pesquisa por "string1" não retornar nada, fazendo com que as correspondências de "string2" apareçam em $foo1 . Além disso, esta abordagem tende a ser menos portável do que os números 2 ou 3 acima.

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

Sério, porém, cara, há um milhão de maneiras de esfolar esse gato.

    
por 04.03.2014 / 03:56