Was ist der effizienteste Weg, um nach zwei völlig getrennten Dingen zu suchen und die Werte getrennten Variablen zuzuweisen?

8

CentOS 6.x.

Ich möchte die Ausgabe von curl übernehmen, nach zwei vollständig getrennten Zeichenfolgen suchen und ihre jeweiligen Werte als Variablen zuweisen. Was ist der effizienteste Weg, dies zu tun (ohne die Ausgabe auf die Festplatte zu schreiben)?

Normalerweise würde ich mir ein Skript mit so etwas wie vorstellen:

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

Dies dauert jedoch zwei Durchgänge und ist schrecklich ineffizient. Gibt es einen besseren Weg? Hoffentlich eine Lösung mit weniger Durchgängen?

Mike B.
quelle

Antworten:

10

1. Greifen Sie in 1 Variable

Versuche dies:

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

Dies wird curl1 Mal ausgeführt und nach Vorkommen von string1oder gesucht string2.

2. Auf 2 Variablen eingehen

Wenn es sich um unterschiedliche Variablen handelt, ändern Sie die Taktik geringfügig. Erfassen Sie die Ausgabe von curlund grepdanach.

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

3. In ein Array greifen

Sie können die Ergebnisse auch in einem Array anstelle separater Variablen speichern.

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

Dies ist etwas schwierig zu handhaben, wenn Ihre Ergebnisse aus dem grep möglicherweise keine Ergebnisse zurückgeben, da die Ergebnisse aus "string2" möglicherweise das erste oder zweite Element im Array sind, aber ich stelle es hier nur als Demonstration von zur Verfügung die Vorgehensweise.

4. Aus grep in vars lesen

Noch eine andere Methode, die den readBefehl zusammen mit der Prozessersetzung verwendet ( <( ..cmd..)).

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

Dies kann wiederum schwierig sein, wenn die Suche nach "string1" nichts zurückgibt und Übereinstimmungen für "string2" angezeigt werden $foo1. Auch dieser Ansatz ist tendenziell weniger portabel als # 2 oder # 3 oben.

slm
quelle
Es tut uns leid! Ich hatte einen Tippfehler. Die Variablen sind tatsächlich unterschiedlich. :-( Zusammenfassung ist jetzt aktualisiert.
Mike B
Möglicherweise möchten Sie beachten, dass die von Ihnen empfohlene Prozessersetzung keine tragbare Option ist.
Mikesserv
@mikeserv - danke für das Feedback, aktualisiert.
slm
3
read var1 var2 <<CURLSED
$(curl $url | sed -nr 's/(regx1)\|(regx2)/"\1"'"$IFS"'"\2"/p')
CURLSED

Im Ernst, Mann, es gibt ungefähr eine Million Möglichkeiten, diese Katze zu häuten.

mikeserv
quelle