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

一、方案一:

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
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值