我正在创建一个Bash脚本来解析以下网页中的空气污染水平:http : //aqicn.org/city/beijing/m/
文件中有很多东西,但这是相关的位:
“iaqi”:[{ “P”: “PM25”, “V”:[ 59,21112], “我”:“由美国驻北京大使馆的空气质量监测器测量北京PM25(细颗粒物)(\ u7f8e \ u56fd \ “”,“”,“” PM10" ,‘v’:15,5,69],‘我’:“北京PM10(可吸入颗粒物),由北京市环境保护监测中心测定,
我希望脚本解析并显示2个数字:当前的PM2.5和PM10级别(上段中以粗体显示的数字)。
CITY="beijing"
AQIDATA=$(wget -q 0 http://aqicn.org/city/$CITY/m/ -O -)
PM25=$(awk -v FS="(\"p\":\"pm25\",\"v\":\\\[|,[0-9]+)" '{print $2}' <<< $AQIDATA)
PM100=$(awk -v FS="(\"p\":\"pm10\",\"v\":\\\[|,[0-9]+)" '{print $2}' <<< $AQIDATA)
echo $PM25 $PM100
即使我可以正确显示PM2.5水平,也无法显示PM10水平。我不明白为什么,因为字符串是相似的。
这里有人可以解释吗?
chw21的有用答案解释了为什么您的方法不起作用。
peak的有用答案是最可靠的,因为它采用了正确的JSON解析。
如果您不想或不能使用第三方实用程序jq
进行JSON解析,建议您使用sed
而不是awk
,因为awk
它不适用于此数据的基于字段的解析。
$ sed -E 's/^.*"pm25"[^[]+\[([0-9]+).+"pm10"[^[]+\[([0-9]+).*$/\1 \2/' <<< "$AQIDATA"
59 15
上面的代码应该与GNU和BSD / OSX一起使用sed
。
要将结果读入变量:
read pm25 pm10 < \
<(sed -E 's/^.*"pm25"[^[]+\[([0-9]+).+"pm10"[^[]+\[([0-9]+).*$/\1 \2/' <<< "$AQIDATA")
注意我如何选择小写的变量名,因为最好避免在shell编程中使用所有大写的变量,以避免与特殊的shell和环境变量发生冲突。
如果您不能依赖源字符串中值的顺序,请使用两个单独的sed
命令:
pm25=$(sed -E 's/^.*"pm25"[^[]+\[([0-9]+).*$/\1/' <<< "$AQIDATA")
pm10=$(sed -E 's/^.*"pm10"[^[]+\[([0-9]+).*$/\1/' <<< "$AQIDATA")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句