这是我尝试过的(以及其他一些迭代)。文件中的片段
APOLLO_KEY=service:abcd
cat packages/graph/.env | gawk '{ if ($0 = "APOLLO_KEY" ) { RS = "=" } ; { print $1 } }'
它返回APOLLO_KEY
而不是文件中每一行的值。我期望并想要获得的价值是
service:abcd
我知道以这种方式解析文件存在相当大的问题。我只是为了一些一次性命令而这样做,此时我对我的 awk 知识/谷歌搜索感到沮丧。
答案1
gawk '{ if ($0 = "APOLLO_KEY" ) { RS = "=" } ; { print $1 } }'
$0 = "APOLLO_KEY"
会将字符串分配给$0
,比较是==
。我认为你不想改变记录这里有分隔符RS
,但是场地分隔符FS
(您需要使用-F
或-vFS=
在命令行上执行此操作,因此它可以在 awk 分割行之前起作用)。另外,不需要使用显式的如果在这里,我们只是将条件放在整个代码块上。
假设简单的数据(并且绝对不是使用完整 shell 语法的东西!),这应该有效:
awk -F= '$1 == "APOLLO_KEY" { print $2 }'
请注意,如果值包含=
符号,则会中断,因为它只采用该行的第二个字段。
如果您需要处理这样的值,一个解决方案是手动删除第一个之前的所有内容=
。我们不妨在代码之外传递字段名称,以使其更简洁:
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