![awk: как вывести значение ключа в файле env?](https://rvso.com/image/178485/awk%3A%20%D0%BA%D0%B0%D0%BA%20%D0%B2%D1%8B%D0%B2%D0%B5%D1%81%D1%82%D0%B8%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B5%20env%3F.png)
это то, что я попробовал (и еще несколько вариантов). фрагмент из файла
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 разделит строку). Также нет необходимости использовать явныйеслиВ этом операторе мы просто ставим условие на весь блок кода.
Если предположить, что данные упрощенные (и определенно не использующие полный синтаксис оболочки!), это должно работать:
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