私が試したことは次のとおりです(いくつかの他の繰り返しで)。ファイルの断片
APOLLO_KEY=service:abcd
cat packages/graph/.env | gawk '{ if ($0 = "APOLLO_KEY" ) { RS = "=" } ; { print $1 } }'
APOLLO_KEY
代わりにファイルの各行の値を返します。私が期待して得たい価値は
service:abcd
このようにファイルを解析する際にかなりの問題があることを知っています。私はただ1回限りのコマンドのためにこれをやっていますが、この時点で私は間違った知識/インターネット検索に欲求不満を感じます。
答え1
gawk '{ if ($0 = "APOLLO_KEY" ) { RS = "=" } ; { print $1 } }'
$0 = "APOLLO_KEY"
文字列をに割り当て、$0
比較はです==
。私の考えでは、あなたは変更したくないと思います。記録RS
ここに区切り記号がありますが、大地区切り記号(awkが行を分割する前に動作するようにコマンドラインでそれを使用または実行するFS
必要があります)。さらに、明示的に使用する必要もありません。-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