Bash-Skript - Speichern Sie die Curl-Ausgabe in einer Variablen und formatieren Sie sie dann anhand einer Zeichenfolge in einer Variablen

7

Ich hatte gehofft, curlDaten in eine Shell-Skriptvariable zu integrieren und diese Variable dann zu verwenden catoder awkzu bearbeiten, als wäre es eine Datei.

Ist dies möglich oder gibt es eine Problemumgehung? Muss ich den curlBefehl in einer Datei speichern?

Muss ich curlfür jede Bit-Formatierung, die ich ausführen möchte, mehrere Male ausführen ?

Ich bin curlipinfo.io und möchte die passenden Zeilen für "Stadt" und "Region" ausgeben. Ich weiß, wie man die Ausgabe wie gewünscht verwendet awkund sedformatiert.

Versuchen Sie beispielsweise, curl ipinfo.io/"8.8.8.8"das Ergebnis für eine Google DNS-IP-Adresse zu erhalten.

Ich möchte nur "Mountain View" und "California", vorzugsweise in derselben Zeile, mit einigen gängigen Formatierungen wie "Mountain View, California" drucken.

cfye14
quelle
1
Was ist Ihre Eingabe und gewünschte Ausgabe?
Heemayl
Sie können, aber es macht keinen Sinn curl, die Ausgabe zu speichern (es sei denn, Sie möchten sie mehrmals verwenden), Sie können sie direkt an catoder weitergeben awk. Wie heemayl sagte, erklären Sie bitte genau, was Sie tun möchten.
Kos
Ich kräusele ipinfo.io und möchte die passenden Linien für Stadt und Region wiedergeben. Ich weiß, wie man die Ausgabe wie gewünscht verwendet awkund sedformatiert. Versuchen Sie zum Beispiel, curl ipinfo.io/"8.8.8.8"für das Ergebnis für eine Google DNS IP-Adresse
cfye14
Was möchten Sie genau drucken? Die ganze Zeile wie in der Ausgabe oder nur "Mountain View" und "California"?
Kos
1
nur "Mountain View" und "California", vorzugsweise in derselben Zeile, mit einigen gängigen Formatierungen, wie Sie wissen, "Mountain View, California"
cfye14

Antworten:

11

Im Allgemeinen gibt es geeignetere Methoden zum Parsen von JSON-Objekten. Da das JSON-Objekt in diesem Fall jedoch sehr einfach ist, können Sie die curlAusgabe in einer Variablen speichern (was möglich ist) und einfach AWK verwenden:

var="$(curl ipinfo.io/"8.8.8.8" 2>/dev/null)"
<<<"$var" awk -F'"' '$2=="city"{printf("%s, ", $4)}$2=="region"{print $4}'
% var="$(curl ipinfo.io/"8.8.8.8" 2>/dev/null)"
% <<<"$var" awk -F'"' '$2=="city"{printf("%s, ", $4)}$2=="region"{print $4}'
Mountain View, California

Wenn Sie die curlAusgabe jedoch nicht mehrmals verwenden möchten, können Sie nur eine Pipe verwenden:

curl ipinfo.io/"8.8.8.8" 2>/dev/null | awk -F'"' '$2=="city"{printf("%s, ", $4)}$2=="region"{print $4}'
curl ipinfo.io/"8.8.8.8" 2>/dev/null | awk -F'"' '$2=="city"{printf("%s, ", $4)}$2=="region"{print $4}'
Mountain View, California

<<<ist eine Form der Eingabeumleitung, die als "here string" bezeichnet wird. Es leitet die STDIN eines Befehls vom Terminal zu einer Zeichenfolge um.

Was hier passiert, ist, dass $varzwischen den doppelten Anführungszeichen erweitert wird; Die STDIN des AWK-Befehls wird vom Terminal zur erweiterten Zeichenfolge umgeleitet, und AWK liest die Zeichenfolge folglich als Eingabedatei.

kos
quelle
Kannst du den <<<Teil etwas genauer erklären ? edit: das nehme ich es?
cfye14
1
@ cfye14 Ich habe eine Erklärung für das <<<Token hinzugefügt : Beachten Sie, dass ich alle diese Informationen gebeten habe, sich des Umfangs Ihrer Frage äußerst sicher zu sein (um zu vermeiden, dass jemand potenziell unbrauchbare Antworten gibt). Ich verstehe, dass die Verarbeitung selbst wahrscheinlich nicht notwendig war. Die Antwort von Janos unten ist genauso gültig.
Kos
6

Ich hatte gehofft, Daten in eine Shell-Skriptvariable zu kräuseln und dann mit cat oder awk diese Variable so zu bearbeiten, als wäre es eine Datei. Ist dies möglich oder gibt es eine Problemumgehung?

Sicher kannst du. Wenn der Inhalt nicht zu groß ist und Sie mehrere Befehle ausführen möchten, um den Inhalt zu analysieren, ist es eine gute Sache, ihn im Speicher zwischenzuspeichern, anstatt ihn jedes Mal neu herunterzuladen.

So speichern Sie das Ergebnis von curlin einer Variablen:

ipinfo=$(curl ipinfo.io/8.8.8.8)

So führen Sie Befehle darauf aus:

<<< "$ipinfo" awk ...
<<< "$ipinfo" sed ...

Die doppelten Anführungszeichen no "$ ipinfo" sind wichtig, um alle Leerzeichen zu erhalten.

Eine "Problemumgehung", um den Inhalt nicht in einer Variablen zu speichern, besteht darin, eine Möglichkeit zu finden, den Inhalt in einer einzelnen Pipeline zu verarbeiten, wie dies bei @kos der Fall war.

Janos
quelle
1

Eine weitere einfache und besser lesbare Möglichkeit, dies zu tun, können Sie verwenden python, die in allen Linux-basierten Systemen vorhanden ist, um den JSON für Sie zu analysieren

Importieren jsonund sysverpacken Sie einfach das jsonObjekt und drucken resultSie dann alle gewünschten Eigenschaften aus dem Objekt:

curl ipinfo.io/"8.8.8.8" 2>/dev/null | 
  python -c 'import  json,sys; 
             result=json.load(sys.stdin); 
             print(result["'city'"] + ", " + result["'region'"])';

Ich habe das Skript besser lesbar hinzugefügt. Sie sollten jedoch eine Zeile einfügen oder \am Ende jeder Zeile hinzufügen , wenn Sie es in mehreren Zeilen schreiben müssen.

Muhammad Soliman
quelle