SED提取值

时间:2012-10-02 10:49:18

标签: sed grep gpsd

任何人都可以帮助我根据下面的文字获取时间,纬度和经度的值

{"class":"TPV","tag":"MID2","device":"/dev/ttyUSB0","mode":3,"time":"2012-10-02T10:43:21.000Z","ept":0.005,"lat":55.190682291,"lon":25.265912847,"alt":19.149,"epx":58.300,"epy":74.796,"epv":144.575,"track":148.2723,"speed":1.623,"climb":-1.471,"eps":149.59}

4 个答案:

答案 0 :(得分:1)

$ grep -oP '"lat":\K[\d.]+' file
$ grep -oP '"lon":\K[\d.]+' file
$ grep -oP '"time":"\K[^"]+' file

答案 1 :(得分:1)

使用egrep和sed

<infile egrep -o '"(lat|lon|time)":"?[^,]*' | sed 's/[^:]*://'

输出:

"2012-10-02T10:43:21.000Z"
55.190682291
25.265912847

如果您不喜欢双引号,请将tr -d '"'附加到管道。

单独使用sed

<infile sed -r 's/"(lat|lon|time)":"?([^,"]*)/\n\2\n/g' | sed -n '2~2p'

输出:

2012-10-02T10:43:21.000Z
55.190682291
25.265912847

第一个sed将匹配分开,所以它们将在每一行上分开,第二个选择它们。

使用tr和grep

<infile tr ',' '\n' | grep 'time\|lon\|lat'

输出:

"time":"2012-10-02T10:43:21.000Z"
"lat":55.190682291
"lon":25.265912847

答案 2 :(得分:0)

我会这样做(作为sed脚本):

#!/bin/sed -f

h;G;G

s/[^\n]*"lat"\s*:\s*\([0-9.]*\)[^\n]*/\1/
s/[^\n]*"lon"\s*:\s*\([0-9.]*\)[^\n]*/\1/
s/\n[^\n]*"time"\s*:\s*"\([^"]*\)".*$/\
\1/

第一行三个命令(h;G;G)复制该行两次。它通过使用“h”命令将输入​​行复制到辅助缓冲区(称为保持空间),然后使用“G”命令将此保留空间的内容附加到模式空间(即工作缓冲区)中来完成此操作,两次。现在我们有三行副本。

为简单起见,为了更加通用,有三个单独的命令来提取数据,但格式类似:

  1. 跳过一些字符,直到找到我们的密钥。请注意我们必须跳过前两个命令中不是换行符([^\n]*)的字符,否则它们会影响它们下方的行,因为它的贪婪行为(即,如果跳过与你一样多的字符)在找到"lat"之前,您将跳过前两行,因为第三行还包含"lat")。在最后一个命令中,您可以跳过任何字符(.*),但必须先跳过换行符以防止它与前面的行匹配。
  2. 跳过密钥
  3. 跳过零个或多个空格字符(\s*
  4. 略过结肠
  5. 跳过更多可选的空格字符
  6. 捕获数据。捕获由反斜杠括号(即\(\))指定,它将把括号中的表达式匹配的输入存储到名为{{1}的辅助“变量”中(如果您有多个捕获组,则第二个将被称为\1,第三个将被称为\2,依此类推,直至\3)。在前两个命令中,我们匹配一系列数字或句点(\9)。在最后一个命令中,我们捕获任何不是双引号([0-9.]*)的字符,但我们也在捕获组之后的一个字符之前跳过双引号(即跳过打开和关闭双引号)。
  7. 跳过更多字符。我们尽可能多地跳过不是新行的字符,因此我们有效地跳到行尾。
  8. 最后,在每个命令中,我们将匹配替换为捕获结果。在最后一个命令中,由于我们匹配并因此跳过分隔第二行和第三行的换行符,因此我们必须将其包含在替换中。要包含它,我们必须在其后添加反斜杠和实际的换行符。这就是为什么替换分为两行。

    希望这有助于=)

答案 3 :(得分:0)

对于GNU awk

,这非常简单
awk -F, '{ for (i=1; i<=NF; i++) if ($i ~ /time|lat|lon/) { match($i, /^\"([^\"]+)\":\"?([^\"]+)\"?/, array); printf "%s: %s\n", array[1], array[2] } }' file.txt

结果:

time: 2012-10-02T10:43:21.000Z
lat: 55.190682291
lon: 25.265912847