awk(或sed / grep)获取子字符串的出现

时间:2019-04-10 21:31:04

标签: regex bash awk sed grep

我在bash变量中有一个json字符串,就像这样:

{
    "items": [
      {
        "foo": null,
        "timestamp": 1553703000,
        "bar": 123
      },
      {
        "foo": null,
        "timestamp": 1553703200,
        "bar": 456
      },
      {
        "foo": null,
        "timestamp": 1553703400,
        "bar": 789
      }
    ]
}

我想知道在给定日期时间之后有多少timestamp个,所以如果我有1553703100,它将返回2

(如果你能给我这个数字的话,加分虚构点!)

为此,我想只获取字符串中"timestamp": \d+,的匹配项,以便可以在bash脚本中循环遍历它们。

我曾经使用过sed和grep,但是从未使用过awk,从我的阅读看来,这也许是与该任务更好的匹配。

其他信息: -JSON已经如上打印,因此时间戳始终位于单独的行上。 -这是要在Cygwin中运行,所以我有awk / gawk,sed和grep / egrep,但可能没有其他人。 -json中可以是任意数量的时间戳。

3 个答案:

答案 0 :(得分:4)

您没有提供预期的输出,因此只是一个猜测,但这是您要执行的操作吗?

$ echo "$var" | jq '.items[].timestamp'
1553703000
1553703200
1553703400

或者也许:

$ echo "$var" | jq '.items[].timestamp | select(. > 1553703100)'
1553703200
1553703400

或:

$ echo "$var" | jq '[.items[].timestamp | select(. > 1553703100)] | length'
2

警告:我只是在学习jq,所以可能会有更好的方法来完成上述操作!

答案 1 :(得分:3)

edit:下面列出的第二种方法存在严重的问题,@ EdMorton对此很有帮助。我选择保留旧代码用于教育目的。

避免使用substr()并捕获到空字符串i

$ awk -v dt=1553703100 '
  /timestamp/ && $2+0>dt {i++}
  END {print i+0}
' <<< "$var"

2

警告:问题代码

在这里,我使用substr(string, index, [characters])来将逗号修剪掉第二个字段。 /timestamp/正则表达式并不复杂;如果您的json变得更加复杂,则可以进行改进。

$ awk -v dt=1553703100 '
  /timestamp/ && substr($2, 0, length($2)) > dt {i++} 
  END {print i}
' <<< "$var"

2

答案 2 :(得分:0)

您还可以快速实施python解决方案:

输入

$ cat data.json 
{
    "items": [
      {
        "foo": null,
        "timestamp": 1553703000,
        "bar": 123
      },
      {
        "foo": null,
        "timestamp": 1553703200,
        "bar": 456
      },
      {
        "foo": null,
        "timestamp": 1553703400,
        "bar": 789
      }
    ]
}

代码

$ cat extract_value2.py 
import json

tLimit = 1553703100
with open('data.json') as f:
    data = json.load(f)
    print([t['timestamp'] for t in data["items"] if t['timestamp'] > tLimit])

输出

$ python extract_value2.py 
[1553703200, 1553703400]

计数代码:

$ cat extract_value2.py 
import json

tLimit = 1553703100
with open('data.json') as f:
    data = json.load(f)
    print(len([t['timestamp'] for t in data["items"] if t['timestamp'] > tLimit]))

输出

$ python extract_value2.py
2