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