Qual é a maneira mais eficiente de grep para 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 no 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 dando dois passes e é terrivelmente ineficiente. Existe uma maneira melhor? Espero que uma solução que envolva menos passes?

Respostas:


10

1. Grepping em 1 variável

Tente o seguinte:

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

Isso executará curl1 vez e grep para ocorrências de string1ou string2.

2. Grepping em 2 variáveis

Se são variáveis ​​diferentes, mude um pouco de tática. Capture a saída curle grepdepois.

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 de lidar, se os resultados do grep não retornarem resultados, pois os resultados de "string2" podem ser o primeiro ou o segundo item da matriz, mas estou fornecendo aqui apenas como uma demonstração de a abordagem.

4. Lendo em vars do grep

Ainda outro método que utiliza o readcomando junto com a substituição do processo ( <( ..cmd..)).

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

Isso novamente pode ser complicado se a pesquisa por "string1" não retornar nada, fazendo com que correspondências para "string2" sejam exibidas $foo1. Além disso, essa abordagem tende a ser menos portátil do que os itens 2 ou 3 acima.


Desculpa! Eu tive um erro de digitação. As variáveis ​​são realmente diferentes. :-( Resumo agora atualizado.
Mike B

Você pode observar que a substituição de processo recomendada está longe de ser uma opção portátil.
precisa saber é o seguinte

@mikeserv - obrigado pelo feedback, atualizado.
Slm

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

Sério, cara, existem milhões de maneiras de esfolar esse gato.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.