在 JSON 文件中查找模式

在 JSON 文件中查找模式

我怎样才能从我的文本文件中选择与此类似的行

"created_at": "Wed Oct 19 12:36:54 +0000 2016"

基本上我需要找到符合模式的线条

  • 以和Wed Oct 19开头
  • 以。。结束2016

但是,Wed Oct 19 12:36:54 +0000 2016可能位于线路的任何位置,并且一天中的任何其他时间也可能位于两者之间。

当我使用

grep -irn "Wed Oct 19" | grep -irn "2016"

我得到了各种各样不想要的结果。

以下是我不想匹配的文件中的类似行的示例:

"created_at": "Tue Jan 31 18:50:26 +0000 2012",

这是推文属性的一部分。

以下是输入的较长部分:

 "contributors": null, 
      "retweeted": false, 
      "in_reply_to_user_id_str": null, 
      "place": null, 
      "retweet_count": 4, 
      "created_at": "Sun Apr 03 23:48:36 +0000 2011", 
      "retweeted_status": {
            "text": "In preparation for the NFL lockout, I will be spending twice as much time analyzing my fantasy baseball team during company time. #PGP", 
            "truncated": false, 
            "in_reply_to_user_id": null, 
            "in_reply_to_status_id": null, 

完整示例输入在此处: https://gist.github.com/hrp/900964

更新:我正在寻找包含此模式的文件名。

答案1

如果它可以在线的任何地方,也可以在两者之间,我想

grep -wirn 'Wed Oct 19 .* 2016' *

应该得到它...

如果你只想要文件名,请使用-l

grep -wirl 'Wed Oct 19 .* 2016' *

笔记

  • -w使用单词边界,以防您想要的文本粘在我们不想匹配的其他内容上(在这种情况下不太可能)
  • -l只打印包含匹配项的文件的文件名
  • .*此处任意数量的任意字符

使用以下命令解析此文件可能没问题grep对于如此简单的事情,用 JSON 解析器David Foerster 的回答是正确的方法(即它可能会更可靠,特别是当您需要做任何复杂的事情时)。

答案2

由于您正在处理 JSON 数据,因此我将使用实际的 JSON 解析器:

LC_TIME=POSIX jq \
  --argjson year 2016 --argjson month 10 --argjson day 19 \
  --arg timefmt '%a %b %d %T %z %Y' \
  '.. | .created_at? | select(.) | strptime($timefmt) | select(.[0] == $year and .[1] + 1 == $month and .[2] == $day) | strftime($timefmt)' \
  twitter.json
  • --arg--argjson设置整个 jq 脚本中使用的命名变量。

  • ..返回所有递归嵌套的对象。

  • .created_at?created_at如果可用则返回具有键的条目的值,null否则返回该条目的值。

  • select(.)仅返回 ECMA 脚本中“真”的值,其中包括非空字符串但不包括null

  • strptime($timefmt)根据以下方式解析日期时间字符串strptime(3)并返回“分解的”日期时间值的元组。

  • select(.[0] == $year and .[1] + 1 == $month and .[2] == $day)$year仅返回给定表达式计算结果为真的值,在这种情况下,变量、$month和的值与$day它们各自的日期时间元组条目匹配。

  • strftime($timefmt)返回按照以下格式格式化为字符串的日期时间元组strftime(3)

这需要 jq v1.5 或更高版本,可在 Ubuntu Xenial(或更高版本)的存储库中找到同名包

答案3

这个 grep 应该能够获取所需的行:

grep -E ".*Wed Oct 19.*2016$" reg.txt

仅搜索文件并输出文件名:

grep -Erl ".*Wed Oct 19.*2016$" /path/to/folders/to/search

相关内容