我正在使用 bash 命令,gps location
它返回日期、时间和位置信息。
[john@hostname :~/develp] $ gps location
Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}
我想将经度写入文件,在到达那里之前我需要正确解析该字符串。
[john@hostname :~/develp] $ variable=`gps location | awk '/"longitude":/ {print $9}'`
[john@hostname :~/develp] $ echo $variable
"133.453",
[john@hostname :~/develp] $
目前,awk
不搜索经度,它只是获取整个字符串并找到第 9 个字符串。理想情况下,我想使用正则表达式/关键字方法并找到经度,然后找到下一个字符串。我尝试过使用grep | cut
也尝试过sed
。不走运,我能做的就是使用awk
.
答案1
去掉后Location:
你就剩下 JSON:
$ echo '{"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
jq .longitude
"133.453"
请参阅手册页是否有一个不预先gps
打印关键字的选项,如果不剥离它很容易,例如:Location:
$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
cut -d':' -f2- | jq .longitude
"133.453"
或者:
$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
sed 's/Location://' | jq .longitude
"133.453"
答案2
不幸的是,我没有足够的声誉来发表评论,但要扩展埃德·莫顿的答案:如果您jq
使用该-r
选项进行调用,当输出只是一个字符串时(就像您的情况一样),它会自动删除引号:
$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' | cut -d':' -f2- | jq -r .longitude
133.453
答案3
如果您想在没有jq
(例如因为它不可用)的情况下尝试此操作,和正如您的示例所暗示的,输出始终是一行,以下sed
方法也适用:
sed -r 's/.*"longitude": "([^"]+)".*/\1/'
这会
- 查找用双引号括起来的字符串(
"([^"]+)"
即开始"
后跟一个包含“anything but"
”的字符串,直到结束"
),其中括起来的内容定义为“捕获组”( ... )
,紧接在字符串之后"longitude":
- 并将整行替换为捕获组 ( ) 的内容
\1
- 在您的情况下,是经度的实际值
测试:
~$ echo 'Location: {"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' | sed -r 's/.*"longitude": "([^"]+)".*/\1/'
133.453
答案4
如果你无法安装 jq,你可以在纯 bash 中使用循环过切来完成。
i=1
words=$(gps location)
word=$(echo $words | cut -d',' -f$i)
while ( [ -n "$word" ] )
do
echo $word | grep longitude | cut -d' ' -f2
(( i+=1 ))
word=$(echo $words | cut -d',' -f$i)
done