使用 Awk 或 sed,如何拉出列表中的最后一项?

Using Awk or sed, how to pull last item in the list?

在下面,我需要使用 Awk 或 sed 获取最后一项 "subnet-0bfc68cb13432a94b" 用双引号引起来?

[
    "subnet-08585db3344bce1ea",
    "subnet-0537a333d2337f361",
    "subnet-0bfc68cb13432a94b"
]

您应该考虑使用 jq 来解析 JSON:

jq -r '.[-1]' file.json

示例:

$ cat << EOF | jq -r '.[-1]'
[
    "subnet-08585db3344bce1ea",
    "subnet-0537a333d2337f361",
    "subnet-0bfc68cb13432a94b" 
]
EOF
subnet-0bfc68cb13432a94b
read -r -d '' content <<EOF
[
    "subnet-08585db3344bce1ea",
    "subnet-0537a333d2337f361",
    "subnet-0bfc68cb13432a94b" 
]
EOF

awk -F'"' '(){o=} END{print o}' <<<"$content"

### output
subnet-0bfc68cb13432a94b

因此,假设没有传递其他信息,这应该是一个简单的解决方案。

基本上:

  • 将字段分隔符设置为 double-qoutes
  • store/overwrite 变量中的值
  • 末尾的输出变量,现在包含该数组的最后一个元素。

利用最后一个没有逗号的元素的 sed 解决方案可能如下所示:

sed -n 's/^[[:space:]]*"\(.*\)"[[:space:]]*$//p' <<<$content

所以:

  • -n标志抑制正常输出
  • 捕获double-quotes中的内容并打印

这可能适合您 (GNU sed):

sed -En 'N;$!D;s/.*"(.*)".*//p' file

捕获最后两行,然后使用模式匹配 return 所需的字符串。

选择:

sed -E '$!{h;d};g;s/.*"(.*)".*//' file

使用任何 awk:

$ awk -F'"' '/"$/{print }' file
subnet-0bfc68cb13432a94b

或任何 sed:

$ sed -n 's/.*"\(.*\)"$//p' file
subnet-0bfc68cb13432a94b