Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash中从Json提取值_Linux_Shell_Awk_Sed_Grep - Fatal编程技术网

Linux 在bash中从Json提取值

Linux 在bash中从Json提取值,linux,shell,awk,sed,grep,Linux,Shell,Awk,Sed,Grep,我正在尝试编写shell脚本,并试图从Json中提取值并将其存储到变量中,以便以后使用。但我无法做到这一点,我尝试了跟进很多链接和建议,可能我做错了什么。 基本上,我使用curl来点击一个url,并从响应中提取一个状态字段的值。 我试着说以下几句话 result=$(curl)http://localhost:9200/domains“|grep”状态“|awk'{print$1}”) echo“结果为”$result curl命令将获取如下内容 {"error":{"root_cause":[

我正在尝试编写shell脚本,并试图从Json中提取值并将其存储到变量中,以便以后使用。但我无法做到这一点,我尝试了跟进很多链接和建议,可能我做错了什么。 基本上,我使用curl来点击一个url,并从响应中提取一个状态字段的值。 我试着说以下几句话

result=$(curl)http://localhost:9200/domains“|grep”状态“|awk'{print$1}”)
echo“结果为”$result

curl命令将获取如下内容

{"error":{"root_cause":[{"type":"index_not_found_exception","reason":"no such index","resource.type":"index_or_alias","resource.id":"domains","index_uuid":"_na_","index":"domains"}],"type":"index_not_found_exception","reason":"no such index","resource.type":"index_or_alias","resource.id":"domains","index_uuid":"_na_","index":"domains"},"status":404}
在这方面的任何帮助都是非常感谢的。我知道我们可以在jq或perl中实现,但我正在寻找使用grep、sed或awk的解决方案

谢谢
Ashit

当您确定
状态
不会在数据中的其他位置弹出,并且始终是数字状态时,您可以尝试

result=$(curl "http://localhost:9200/domains" | \
    sed -rn 's/.*,"status":([0-9]*).*/\1/p')

使用
-E
如果没有选项
-r

当您确定
状态
不会在数据中的其他位置弹出,并且始终是数字状态时,您可以尝试

result=$(curl "http://localhost:9200/domains" | \
    sed -rn 's/.*,"status":([0-9]*).*/\1/p')

使用
grep
awk

result=$(curl "http://localhost:9200/domains" | \
    grep -o -E "\"status\":[0-9]+" | awk -F\: '{print $2}')
  • 首先,使用
    grep
    提取模式
    状态:[0-9]+
  • 然后,使用
    awk
    将结果按
    分割,并打印第二个字段

  • 使用
    grep
    awk

    result=$(curl "http://localhost:9200/domains" | \
        grep -o -E "\"status\":[0-9]+" | awk -F\: '{print $2}')
    
  • 首先,使用
    grep
    提取模式
    状态:[0-9]+
  • 然后,使用
    awk
    将结果按
    分割,并打印第二个字段

  • 考虑到输入的单一样本,您只需要:

    curl '...' | awk -F'[:}]' '{print $(NF-1)}'
    

    如果这还不是您所需要的全部,那么编辑您的问题以澄清您的需求,并提供更具真正代表性的示例输入和预期输出。

    考虑到单个输入示例,您所需要的是:

    curl '...' | awk -F'[:}]' '{print $(NF-1)}'
    

    如果这还不是您所需要的全部,那么编辑您的问题以澄清您的需求,并提供更具代表性的示例输入和预期输出。

    首先选择正确的工具。我建议使用.grep、sed和awk,因为它们不适合处理JSON之类的结构化数据,所以基于这些工具构建的任何东西都非常脆弱。例如,当有人更改输入数据的格式时,它将被破坏,而没有人希望他们的JSON工具在这种情况下被破坏<代码>jq。状态是这里的方法。首先选择正确的工具。我建议使用.grep、sed和awk,因为它们不适合处理JSON之类的结构化数据,所以基于这些工具构建的任何东西都非常脆弱。例如,当有人更改输入数据的格式时,它将被破坏,而没有人希望他们的JSON工具在这种情况下被破坏
    jq.status
    是一种方法。当你使用awk时,你永远不需要grep,因为awk可以做grep可以做的任何有用的事情。任何
    grep…|awk…
    pipline可以作为一个单独的awk命令来编写,例如,您的代码可以作为
    awk'match($0,/\“status\”):([0-9]+)/,a){print a[1]}'
    当您使用awk时,您永远不需要grep,因为awk可以做grep可以做的任何有用的事情。任何
    grep…|awk…
    pipline可以作为单个awk命令编写,例如,您的代码可以作为
    awk'匹配($0,/\“status\”:([0-9]+)/,a){print a[1]}'用GNU awk编写。