¿Cuál es la forma más eficiente de buscar dos cosas completamente separadas y asignar los valores a variables separadas?

8

CentOS 6.x

Quiero tomar la salida de curl, grep para dos cadenas completamente separadas y asignar sus respectivos valores como variables. ¿Cuál es la forma más eficiente de hacer esto (sin escribir la salida en el disco)?

Normalmente pensaría en tener un script con algo como:

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

Pero esto termina tomando dos pases y es terriblemente ineficiente. ¿Hay una mejor manera? ¿Ojalá una solución que implique menos pases?

Mike B
fuente

Respuestas:

10

1. Grepping en 1 variable

Prueba esto:

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

Esto se ejecutará curl1 vez y grep para ocurrencias de string1o string2.

2. Grepping en 2 variables

Si son variables diferentes, cambie las tácticas ligeramente. Capture la salida de curly luego grepdespués.

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

3. Grepping en una matriz

También puede almacenar los resultados en una matriz en lugar de variables separadas.

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

Este es un poco difícil de manejar si los resultados de grep podrían no devolver resultados, ya que los resultados de "string2" podrían ser el primer o el segundo elemento de la matriz, pero lo proporciono aquí solo como una demostración de el enfoque.

4. Leer en vars desde grep

Otro método más que hace uso del readcomando junto con la sustitución del proceso ( <( ..cmd..)).

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

De nuevo, esto puede ser complicado si la búsqueda de "cadena1" no devuelve nada, lo que hace que aparezcan coincidencias para "cadena2" $foo1. Además, este enfoque tiende a ser menos portátil que el n. ° 2 o n. ° 3 anterior.

slm
fuente
¡Lo siento! Tuve un error tipográfico. Las variables son realmente diferentes. :-( El resumen ahora está actualizado.
Mike B
Es posible que desee tener en cuenta que la sustitución del proceso que recomienda está lejos de ser una opción portátil.
mikeserv
@mikeserv: gracias por los comentarios, actualizados.
slm
3
read var1 var2 <<CURLSED
$(curl $url | sed -nr 's/(regx1)\|(regx2)/"\1"'"$IFS"'"\2"/p')
CURLSED

En serio, amigo, hay como un millón de formas de desollar a este gato.

mikeserv
fuente