awk: ¿cómo imprimo el valor de una clave en un archivo env?

awk: ¿cómo imprimo el valor de una clave en un archivo env?

esto es lo que probé (y algunas otras iteraciones). fragmento de archivo

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

devuelve APOLLO_KEYen lugar del valor de cada fila del archivo. el valor que esperaría y desearía obtener es

service:abcd

Entiendo que existen problemas considerables al analizar el archivo de esta manera. Solo lo estoy haciendo para algunos comandos únicos, y en este punto estoy frustrado con mi conocimiento extraño/buscar en Google.

Respuesta1

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

$0 = "APOLLO_KEY"asignaría la cadena a $0, la comparación es ==. No creo que quieras cambiar elregistroseparador RSaquí, pero elcamposeparador FS(y debe hacerlo con -Fo -vFS=en la línea de comando, para que funcione antes de que awk divida la línea). Además, no es necesario utilizar un explícitosideclaración aquí, simplemente ponemos la condición en todo el bloque de código.

Suponiendo datos simplistas (¡y definitivamente no algo que use la sintaxis completa del shell!), esto debería funcionar:

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

Tenga en cuenta que esto se rompe si el valor contiene =signos, ya que solo toma el segundo campo de la línea.

Si necesita lidiar con valores como ese, una solución sería eliminar manualmente todo hasta el primero =. También podríamos pasar el nombre del campo fuera del código para hacerlo un poco más limpio:

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

Respuesta2

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

producción

service:abcd

información relacionada