使用关键字解析字符串

Ton*_*one 5 bash sed awk cut

我正在使用 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"}
Run Code Online (Sandbox Code Playgroud)

我想将经度写入文件,在到达那里之前我需要正确解析字符串。

[john@hostname :~/develp] $ variable=`gps location | awk '/"longitude":/ {print $9}'`
[john@hostname :~/develp] $ echo $variable
"133.453",
[john@hostname :~/develp] $
Run Code Online (Sandbox Code Playgroud)

目前,awk不是搜索经度,它只是获取整个字符串并找到第 9 个字符串。理想情况下,我想使用正则表达式/关键字方法并找到经度,然后找到下一个字符串。我试过使用grep | cut也试过sed。不走运,我能做的就是使用awk.

Ed *_*ton 12

去掉Location:JSON 就剩下你了:

$ echo '{"date": "16/07/20", "time": "19:01:22", "latitude": "34.321", "longitude": "133.453", "altitude": "30m"}' |
    jq .longitude
"133.453"
Run Code Online (Sandbox Code Playgroud)

查看手册页是否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"
Run Code Online (Sandbox Code Playgroud)

或者:

$ 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"
Run Code Online (Sandbox Code Playgroud)


小智 5

不幸的是,我没有足够的声誉来发表评论,但要扩展 Ed Morton 的回答:如果您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
Run Code Online (Sandbox Code Playgroud)