awk: Wie drucke ich den Wert eines Schlüssels in einer Umgebungsdatei?

awk: Wie drucke ich den Wert eines Schlüssels in einer Umgebungsdatei?

das habe ich versucht (und ein paar andere Iterationen). Ausschnitt aus Datei

APOLLO_KEY=service:abcd
cat packages/graph/.env | gawk '{ if ($0 = "APOLLO_KEY" ) { RS = "=" } ; { print $1 } }'

es gibt APOLLO_KEYstattdessen den Wert für jede Zeile in der Datei zurück. Der Wert, den ich erwarten würde und erhalten möchte, ist

service:abcd

Ich verstehe, dass es erhebliche Probleme gibt, die Datei auf diese Weise zu analysieren. Ich mache das nur für einige einmalige Befehle und bin an diesem Punkt mit meinen awk-Kenntnissen/Google-Erfahrungen unzufrieden.

Antwort1

gawk '{ if ($0 = "APOLLO_KEY" ) { RS = "=" } ; { print $1 } }'

$0 = "APOLLO_KEY"würde die Zeichenfolge zuweisen $0, Vergleich ist ==. Ich glaube nicht, dass Sie das ändern möchtenaufzeichnenTrennzeichen RShier, aber dieFeldTrennzeichen (und Sie müssen dies mit oder auf der Befehlszeile FStun , damit es funktioniert, bevor awk die Zeile teilt). Außerdem müssen Sie kein explizites-F-vFS=WennAnweisung hier, wir legen die Bedingung einfach auf den gesamten Codeblock.

Unter der Annahme vereinfachter Daten (und auf keinen Fall von Daten, die die vollständige Shell-Syntax verwenden!) sollte dies funktionieren:

awk -F= '$1 == "APOLLO_KEY" { print $2 }'

Beachten Sie, dass dies unterbrochen wird, wenn der Wert =Zeichen enthält, da nur das zweite Feld in der Zeile übernommen wird.

Wenn Sie mit solchen Werten arbeiten müssen, besteht eine Lösung darin, alles bis zum ersten manuell zu entfernen =. Wir können den Feldnamen auch außerhalb des Codes übergeben, um ihn etwas übersichtlicher zu gestalten:

awk -v key=APOLLO_KEY -F= '$1 == key { sub(/^[^=]+=/, ""); print }'

Antwort2

awk -F "=" '{for(i=1;i<=NF;i++){if($i ~ /APOLLO_KEY/)print $(i+1)}}' filename

Ausgabe

service:abcd

verwandte Informationen