gps location
日付、時刻、位置情報を返すbashコマンドを使用しています。
[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
残念ながら、私はコメントする評判が十分ではありませんが、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
答え3
この機能を使用せずに試したい場合jq
(例:利用できない場合)そしてあなたの例が示すように、出力は常に1行で、次のsed
方法も機能します。
sed -r 's/.*"longitude": "([^"]+)".*/\1/'
これは
- 二重引用符で囲まれた文字列を探します(
"([^"]+)"
例:開始の後に"
「最後まで」以外の"
文字列が含まれています)。ここで囲まれた内容は、文字列の直後に"
「キャプチャグループ」として定義されます。( ... )
"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