我有大量的 json 文件,之前我被告知要使用下面这行搜索某条推文是否是在某个日期的特定时间范围内创建的:
grep -wirnEzc '},.*created_at":\s"Wed Oct 19 2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00)) .* 2016' *
我不知道下面到底想表达什么:
2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00))
现在,我需要对其进行更改,以便能够找到此 grep 返回的 2016 年 7 月 17 日至 2016 年 11 月 8 日之间“created_at”字段的结果数。以下是其中一个 json 文件的示例: https://hastebin.com/budovutume.scala
如您所见,每个 json 文件可以包含各种推文。因此,基本上我希望搜索所有这些 *.json 文件并搜索"created_at":
遵循的模式在下一行因为"retweeted":
其他内容(例如个人资料或个人资料图片)可能具有该属性"created_at":
。我要查找的日期范围是2016年7月17日至2016年11月8日。
一个有趣的例子(不按日期):
},
"created_at": "Wed Dec 14 22:34:28 +0000 2016",
"retweeted": false,
"coordinates": null,
"in_reply_to_user_id_str": null,
"source": "<a href=\"https://ifttt.com\" rel=\"nofollow\">IFTTT</a>",
"in_reply_to_status_id_str": null,
"in_reply_to_screen_name": null,
"in_reply_to_user_id": null,
"extended_entities": {
答案1
回答你的第一个问题:该表达式2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00))
只是一个正则表达式,匹配以 , 开头的字符串2
,后跟任何一个,其中1:AB:CD
A 和 C 是 0-5 之间的数字,B 和 D 是 0-9 之间的数字,或者,其中2:AB:CD
A 是 0-2 之间的数字,C 是 0-5 之间的数字,B 和 D 是 0-9 之间的数字,或者用2:30:00
。这是匹配21:00:00
和之间22:30:00
(包括 和 )所有时间的非常粗略的方法。编写这样的正则表达式来匹配某个任意起点和终点之间的日期或时间将是一项非常繁琐的工作。
您的 JSON 文件的链接不再有效,但我会尝试根据您提供的信息回答您的主要问题。顺便说一句,您的原始grep
命令有点矛盾,因为您给出了选项-n
(打印行号)和-c
(仅打印匹配的行数),它们是互斥的。所以我不确定您想要提取什么信息(行号或计数)。
以下命令将提取包含单词 和 的所有行created_at
,这些行位于包含单词 的行之前retweeted
:
grep -rn -B1 'retweeted' * | grep 'created_at'
思路是第一个 grep 打印匹配的每一行retweeted
以及它之前的行。第二个 grep 过滤掉包含 的行created_at
。
现在,您将获得所有日期及其行号的列表。过滤日期范围比较困难;如果您很少需要这样做,则可以使用正则表达式
grep -E '(July (1[7-9]|[23].)|August .*|September .*|October .*|November [1-8]), 2016'
适合您的特定日期范围(但范围越复杂,此方法越难)。