Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex awk(或sed/grep)来获取子字符串的出现次数_Regex_Bash_Awk_Sed_Grep - Fatal编程技术网

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

Regex awk(或sed/grep)来获取子字符串的出现次数,regex,bash,awk,sed,grep,Regex,Bash,Awk,Sed,Grep,我在bash变量中有一个json字符串,如下所示: { "items": [ { "foo": null, "timestamp": 1553703000, "bar": 123 }, { "foo": null, "timestamp": 1553703200, "bar": 456 }, { "foo": null

我在bash变量中有一个json字符串,如下所示:

{
    "items": [
      {
        "foo": null,
        "timestamp": 1553703000,
        "bar": 123
      },
      {
        "foo": null,
        "timestamp": 1553703200,
        "bar": 456
      },
      {
        "foo": null,
        "timestamp": 1553703400,
        "bar": 789
      }
    ]
}
我想知道有多少时间戳在给定的日期时间之后,所以如果我有1553703100,它将返回2

如果你能给我这个数字,我会给你额外的假想点数

作为实现这一目标的一步,我只想在字符串中获得timestamp:\d+的匹配项,以便在bash脚本中循环它们

我曾经使用过sed和grep,但从未使用过awk,从我的阅读来看,这可能更适合这个任务

其他资料: -如上所述,json已经打印好了,所以时间戳总是在单独的行上。 -这是在Cygwin中运行的,所以我有awk/gawk、sed和grep/egrep,但可能没有其他。 -json中可以有任意数量的时间戳。

编辑:下面列出的第二种方法存在严重问题,@EdMorton对此进行了非常有益的概述。我选择保留旧代码用于教育目的

避免的substr和捕获的空字符串i:

编辑:下面列出的第二种方法有严重的问题,@EdMorton对此进行了非常有益的概述。我选择保留旧代码用于教育目的

避免的substr和捕获的空字符串i:


您没有提供预期的输出,因此这是一个猜测,但这是您正在尝试做的吗

$ echo "$var" | jq '.items[].timestamp'
1553703000
1553703200
1553703400
或者可能:

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


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

您没有提供预期的输出,因此这只是一个猜测,但这就是您想要做的吗

$ echo "$var" | jq '.items[].timestamp'
1553703000
1553703200
1553703400
或者可能:

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


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

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

输入:

代码:

输出:

计数代码:

输出:


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

输入:

代码:

输出:

计数代码:

输出:


使用“jq”来解析JSON@GillesQuenot,OP指定可用的工具jq在cygwin上可用。我不知道如何使用jq,因为每个人都忙着告诉我如何使用它,以至于他们忘记发布实际的解决方案。谢谢大家!两个答案都很好。我没有安装jq,所以我将使用awk解决方案。希望我能将2个答案标记为已接受:-使用“jq”解析JSON@GillesQuenot,OP指定可用的工具jq在cygwin上可用。我不知道如何使用jq,因为每个人都忙着告诉我如何使用它,以至于他们忘记发布实际的解决方案。谢谢大家!两个答案都很好。我没有安装jq,所以我将使用awk解决方案。希望我能将2个答案标记为已接受:-整洁,谢谢。OP指定他希望记录的计数大于指定的时间戳。在jq里有什么办法吗?@vintnes我在谷歌上搜索了几个jq的例子,并根据它们更新了我的答案。很好,谢谢。OP指定他希望记录的计数大于指定的时间戳。在jq?@vintnes中有什么方法可以做到这一点吗?我在谷歌上搜索了几个jq示例,并根据它们更新了我的答案。substr的第二个参数是substring的起始位置。awk中的所有数组索引、字段和字符串都从1开始,而不是从0开始。当您使用0作为substr的第二个参数时,awk将其视为任何其他无效值,请尝试awk“BEGIN{print substrbanas,-27,3}”,并将其视为指定了1。第三个参数是您希望substr的长度。使用长度$2与将该字段留空相同,因为它将为您提供字符串的完整长度。ITYM substr$2,1,长度$2-1,但您可以使用$2+0来去除。最终打印应该是打印i+0,这样即使没有值匹配,也会得到数字输出,而不是空字符串输出。substr的第二个参数是子字符串的起始位置。awk中的所有数组索引、字段和字符串都从1开始,而不是从0开始。当您使用0作为substr的第二个参数时,awk将其视为任何其他无效值,请尝试awk“BEGIN{print substrbanas,-27,3}”,并将其视为指定了1。第三个参数是您希望substr的长度。使用长度$2与将该字段留空相同,因为它将为您提供字符串的完整长度。ITYM substr$2,1,长度$2-1,但您可以使用$2+0来去除。最终打印应该是打印i+0,因此即使没有值匹配,也会得到数字输出,而不是在这种情况下的空字符串输出。
$ echo "$var" | jq '[.items[].timestamp | select(. > 1553703100)] | length'
2
$ 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