我怎样才能从我的文本文件中选择与此类似的行
"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