目录
- 一、方案一:
- 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