![awk:如何列印 env 檔案中鍵的值?](https://rvso.com/image/178485/awk%EF%BC%9A%E5%A6%82%E4%BD%95%E5%88%97%E5%8D%B0%20env%20%E6%AA%94%E6%A1%88%E4%B8%AD%E9%8D%B5%E7%9A%84%E5%80%BC%EF%BC%9F.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 分割行之前起作用)。另外,不需要使用顯式的如果在這裡,我們只是將條件放在整個程式碼區塊上。
假設簡單的資料(並且絕對不是使用完整 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