awk: env ファイル内のキーの値を印刷するにはどうすればいいですか?

awk: env ファイル内のキーの値を印刷するにはどうすればいいですか?

これは私が試したこと(および他のいくつかの反復)です。ファイルからの抜粋

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

APOLLO_KEYファイル内の各行の値の代わりに返されます。私が期待し、取得したい値は

service:abcd

この方法でファイルを解析すると、かなりの問題があることは理解しています。私は単にいくつかの 1 回限りのコマンドのためにこれを実行していますが、この時点では、awk の知識と Google 検索に不満を感じています。

答え1

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

$0 = "APOLLO_KEY"は文字列を に代入します$0。比較は です==。 を変更したくないと思います。記録ここでセパレータを使用しますRSが、分野セパレータ(コマンドラインでまたはFSを使用してこれを行う必要があるため、awkが行を分割する前に機能します)。また、明示的な-F-vFS=もしここでは、コード ブロック全体に条件を設定します。

単純なデータ(完全なシェル構文を使用するものではないことは間違いありません)を想定すると、次のように動作するはずです。

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

値に=符号が含まれている場合は、行の 2 番目のフィールドのみを取得するため、これは機能しないことに注意してください。

このような値を処理する必要がある場合、最初の まですべてを手動で削除することが 1 つの解決策です=。フィールド名をコードの外で渡して、もう少しきれいにすることもできます。

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

答え2

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

出力

service:abcd

関連情報