Qual è il modo più efficiente per grep per due cose completamente separate e assegnare i valori a variabili separate?


8

CentOS 6.x

Voglio prendere l'output di curl, grep per due stringhe completamente separate e assegnare i rispettivi valori come variabili. Qual è il modo più efficiente per farlo (senza scrivere l'output su disco)?

Normalmente penserei di avere una sceneggiatura con qualcosa del tipo:

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

Ma questo finisce per fare due passaggi ed è orribilmente inefficiente. Esiste un modo migliore? Eventualmente una soluzione che comporta un minor numero di passaggi?

Risposte:


10

1. Grepping in 1 variabile

Prova questo:

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

Questo verrà eseguito curl1 volta e grep per occorrenze di string1o string2.

2. Grepping in 2 variabili

Se sono variabili diverse, cambia leggermente la tattica. Cattura l'output di curle grepsuccessivamente.

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

3. Grepping in un array

È inoltre possibile archiviare i risultati in un array anziché in variabili separate.

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

Questo è un po 'complicato da gestire se i risultati del grep potrebbero non restituire risultati, poiché i risultati di "string2" potrebbero essere il primo o il secondo elemento dell'array, ma lo sto fornendo qui solo come dimostrazione di l'approccio.

4. Leggere in var da grep

Ancora un altro metodo che utilizza il readcomando insieme alla sostituzione del processo ( <( ..cmd..)).

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

Anche questo può essere complicato se la ricerca di "string1" non restituisce nulla, causando la visualizzazione di eventuali corrispondenze per "string2" $foo1. Anche questo approccio tende ad essere meno portabile rispetto al n. 2 o al n. 3 sopra.


Scusate! Ho avuto un refuso. Le variabili sono in realtà diverse. :-( Il riepilogo è ora aggiornato.
Mike B

Si consiglia di notare che la sostituzione del processo consigliata non è un'opzione portatile.
Mikeserv

@mikeserv - grazie per il feedback, aggiornato.
slm

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

Seriamente, però, ragazzo, ci sono circa un milione di modi per scuoiare questo gatto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.