【问题标题】:How to parse JSON in shell script?如何在 shell 脚本中解析 JSON?
【发布时间】:2018-11-27 22:01:40
【问题描述】:

我运行 curl 命令$(curl -i -o - --silent -X GET --cert "${CERT}" --key "${KEY}" "$some_url") 并将响应保存在变量响应中。 ${response}如下图

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 34
Connection: keep-alive
Keep-Alive: timeout=5
X-XSS-Protection: 1; 

{"status":"running","details":"0"}

我想解析 JSON {"status":"running","details":"0"} 并将“运行”和“详细信息”分配给两个不同的变量,我可以在其中打印状态和详细信息。此外,如果状态等于错误,脚本应该退出。我正在做以下事情来完成任务-

status1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.status')
details1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.details')
echo "Status: ${status1}"
echo "Details: ${details1}"
if [[ $status1 == 'error' ]]; then
    exit 1
fi

我不想解析 JSON 两次,而只想解析一次。因此,我想合并以下几行,但仍将状态和详细信息分配给两个单独的变量-

status1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.status')
details1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.details')

【问题讨论】:

  • 您的curl 命令是什么样的?如果您无论如何都要丢弃标头,则可以首先将它们排除在 $response 之外。
  • 上面添加了 curl 命令
  • 如果你删除-i,你将不会得到标题。

标签: json bash shell sh jq


【解决方案1】:

首先,停止对curl 使用-i 参数。这消除了对 awk 的需要(或事后对标头的任何其他修剪)。

第二:

{
  IFS= read -r -d '' status1
  IFS= read -r -d '' details1
} < <(jq -r '.status + "\u0000" + .details + "\u0000"' <<<"$response")

使用 NUL 作为分隔符的优点是它是唯一一个不能出现在 C 风格字符串的值中的字符(这是 shell 变量值的存储方式)。

【讨论】:

    【解决方案2】:

    您可以使用如下结构:

    read status1 details1 < <(jq -r '.status + " " + .details' <<< "${response}")
    

    您可以使用 read 将不同的输入分配给两个变量(或数组,如果需要),并使用 jq 打印您需要的数据,并用空格分隔。

    【讨论】:

    【解决方案3】:

    正如 Benjamin 已经建议的那样,仅检索 json 是一种更好的方法。 Poshi 的解决方案是可靠的。

    但是,如果您正在寻找最紧凑的方法来执行此操作,则无需将响应保存为变量,如果您要做的唯一事情是一次性从中提取其他变量.只需将 curl 直接插入:

    curl "whatever" | jq -r '[.status, .details] |@tsv' 
    

    curl "whatever" | jq -r '[.status, .details] |join("\t")'
    

    你会得到你的价值观。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 2014-05-05
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多