栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

shell发送http请求并解析返回值json中字段的值

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

shell发送http请求并解析返回值json中字段的值

目录
  • 一、方案一:
    • 1、适用场景
    • 2、解析
    • 3、命令解释
      • (1)第一个sed命令的意思是将json数据中的“,”替换为换行符“n”,这样该串数据就变为每一行一个字段的内容,即按逗号分隔数据串。
      • (2)第二个grep命令的意思是查找“code”关键字,并单列出来。
      • (3)第三个sed命令的意思是将(2)中的结果再次按冒号“:”进行分隔。
      • (4)第四个sed命令的意思是将(3)中的结果,删除第一行内容,即删除“code”行。
      • (5)最后一个sed命令的意思是将最后的花括号“}”用空字符替换,最终得到我们想要的值,当然本示例中code后面没有花括号,所以不需要
    • 4、如果我们想把上述结果存进变量里使用的话,可以使用下面的命令
      • 方法一:用`符号
      • 方法二:用`符号
  • 二、方案二:
    • 1、适用场景
    • 2、解析

一、方案一: 1、适用场景

http://192.168.0.44:7102/time
返回值是一整行

{"code":0,"currentTime":"30/May/2022:14:47:54 +0000","timestamp":1653922074.825,"time_iso8601":"2022-05-30T14:47:54+00:00","year":""}
2、解析
cd /tmp
APP=time
rm -rf $APP
wget -q 192.168.0.44:7102/time
chmod 777 $APP
content=`cat ./$APP`
echo "content: $content"
if [ -z "$content" ]
then
      echo "$content is empty"
      # 继续从中国天气获取
else
      echo "$content is not empty"
      # 解析json

	code=`echo $content | sed 's/,/n/g' | grep "code" | sed 's/:/n/g' | sed '1d' | sed 's/"//g'`
	echo "code: $code"
	if [ "$code" != "0" ];then
		echo "错误"
		exit 1
	fi
	
	year=`echo $content | sed 's/,/n/g' | grep "year" | sed 's/:/n/g' | sed '1d' | sed 's/"//g'`
	echo "year: $year"
	month=`echo $content | sed 's/,/n/g' | grep "month" | sed 's/:/n/g' | sed '1d' | sed 's/"//g'`
	echo "month: $month"
	day=`echo $content | sed 's/,/n/g' | grep "day" | sed 's/:/n/g' | sed '1d' | sed 's/"//g'`
	echo "day: $day"
	hour=`echo $content | sed 's/,/n/g' | grep "hour" | sed 's/:/n/g' | sed '1d' | sed 's/"//g'`
	echo "hour: $hour"
	minute=`echo $content | sed 's/,/n/g' | grep "minute" | sed 's/:/n/g' | sed '1d' | sed 's/"//g'`
	echo "minute: $minute"
	second=`echo $content | sed 's/,/n/g' | grep "second" | sed 's/:/n/g' | sed '1d' | sed 's/"//g' | sed 's/}//g'`
	echo "second: $second"

	date -s $year.$month.$day-$hour:$minute:$second
	echo "date -s $year.$month.$day-$hour:$minute:$second"
fi
3、命令解释 (1)第一个sed命令的意思是将json数据中的“,”替换为换行符“n”,这样该串数据就变为每一行一个字段的内容,即按逗号分隔数据串。
$ cat time
$ {"code":0,"currentTime":"30/May/2022:14:47:54 +0000","timestamp":1653922074.825,"time_iso8601":"2022-05-30T14:47:54+00:00","year":""}
# 将逗号替换成换行符
$ cat time | sed 's/,/n/g'
$ {"code":0
"currentTime":"30/May/2022:14:47:54 +0000"
"timestamp":1653922074.825
"time_iso8601":"2022-05-30T14:47:54+00:00"
"year":""}
(2)第二个grep命令的意思是查找“code”关键字,并单列出来。
$ cat time | sed 's/,/n/g' | grep "code"
$ {"code":0
(3)第三个sed命令的意思是将(2)中的结果再次按冒号“:”进行分隔。
$ cat time | sed 's/,/n/g' | grep "code" | sed 's/:/n/g'
$ {"code"
0
(4)第四个sed命令的意思是将(3)中的结果,删除第一行内容,即删除“code”行。
$ cat time | sed 's/,/n/g' | grep "code" | sed 's/:/n/g' | sed '1d'
$ 0
(5)最后一个sed命令的意思是将最后的花括号“}”用空字符替换,最终得到我们想要的值,当然本示例中code后面没有花括号,所以不需要
$ cat time | sed 's/,/n/g' | grep "code" | sed 's/:/n/g' | sed '1d' | sed 's/"//g'
$ 21
# second如下解析:,需要替换花括号和双引号
$ cat time | sed 's/,/n/g' | grep "second" | sed 's/:/n/g' | sed '1d' | sed 's/}//g' | sed 's/"//g'

因此需要将其中的引号去掉才是我们最终想要的结果21。
sed ‘s/"//g’ 的意思是将前面的结果中的引号"用空字符代替,最后的g参数表示替换所有符合的引号"。

4、如果我们想把上述结果存进变量里使用的话,可以使用下面的命令 方法一:用`符号
code=`echo $content | sed 's/,/n/g' | grep "code" | sed 's/:/n/g' | sed '1d' | sed 's/}//g'`
echo "code: $code"
方法二:用`符号
code=$(cat time | sed 's/,/n/g' | grep "code" | sed 's/:/n/g' | sed '1d' | sed 's/}//g')
echo "code: $code"

参考:
Shell使用grep和sed命令提取json数据中指定字段的值

二、方案二: 1、适用场景

json是格式化有换行

{
	code: 0,
	year: "2022",
	month: "05",
	day: "31",
	hour: "11",
	minute: "20",
	second: "21"
}
2、解析
#!/bin/sh
 
jsonpath='time.json'
code=''
if [ ! -f $jsonpath ]; 
  then echo "file not exist"
  exit 0
fi
while read line
do  
   #contain keywords
  [[ $line =~ "code"  ]] && {
  
    code=${line:15:10}          
    echo $code
  } 
done < $jsonpath
 
if [ ! -n :"$code" ]; then
  # empty 
  exit 0
fi
 
 
echo $code
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/939881.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号