![awk: env 파일의 키 값을 어떻게 인쇄하나요?](https://rvso.com/image/178485/awk%3A%20env%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%ED%82%A4%20%EA%B0%92%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%9D%B8%EC%87%84%ED%95%98%EB%82%98%EC%9A%94%3F.png)
이것이 제가 시도한 것입니다(그리고 몇 가지 다른 반복). 파일의 일부
APOLLO_KEY=service:abcd
cat packages/graph/.env | gawk '{ if ($0 = "APOLLO_KEY" ) { RS = "=" } ; { print $1 } }'
APOLLO_KEY
파일의 각 행에 대한 값 대신 반환됩니다 . 내가 기대하고 얻고 싶은 가치는
service:abcd
이런 식으로 파일을 구문 분석하는 데 상당한 문제가 있다는 것을 알았습니다. 나는 단지 일회성 명령을 위해 이 작업을 수행하고 있으며 이 시점에서 내 잘못된 지식/인터넷 검색에 좌절감을 느꼈습니다.
답변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 }'
값에 =
부호가 포함되어 있으면 줄의 두 번째 필드만 사용하므로 이 내용이 중단됩니다.
그러한 값을 처리해야 하는 경우 한 가지 해결책은 첫 번째 =
. 좀 더 깔끔하게 만들기 위해 코드 외부에 필드 이름을 전달할 수도 있습니다.
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