如何在文件中搜索特定日期的特定字符串?

如何在文件中搜索特定日期的特定字符串?

如何在特定日期的文件中搜索特定字符串?

例如,我有 3 个文件,名为

'a1' dated: 20 Feb,
'a2' dated 21 Feb,
'a3' dated 22 Feb.

现在我想在日期 = '21 Feb' 的所有文件中搜索某个字符串,例如 'JMS111'。

我尝试了以下命令但没有成功:

ls -lt |grep 'JMS111' -ctime 2019/02/21 
find -name '*.xml' -type f -printf '%Tw:%h/%f\0' | grep 'JMS111'

答案1

解决此问题的一种方法是设置时间戳文件以将您要查找的日期括起来:

touch -t 201902210000 /tmp/start-time
touch -t 201902212359.59 /tmp/end-time

...然后请求find比开始时间更新的文件,但是不是比结束时间更新:

find . -type f  -newer /tmp/start-time  ! -newer /tmp/end-time

把它们放在一起:

touch -t 201902210000 /tmp/start-time
touch -t 201902212359.59 /tmp/end-time
find . -type f -newer /tmp/start-time  ! -newer /tmp/end-time -name '*.xml' -exec grep JMS111 /dev/null {} +
rm /tmp/start-time /tmp/end-time

这将在正确的时间范围内查找名称以 结尾的文件.xml,然后将这些文件名传递给grep,每次传递尽可能多的文件名。我已添加/dev/null一个“文件”供 grep 搜索,以及来自 的文件名find(如果有)。这样,如果只有一个匹配的文件,则grep“强制”报告匹配的文件名(因为 /dev/null 永远不会匹配,因此不会报告)。

您的输出将是这些文件的文件名和匹配行。

答案2

您可以使用

find . -name 'a[123]' -ctime 6 | xargs grep -l 'JMS111'

它将-ctime 6查找任何 6 天前的文件。它实际上会将文件的创建日期与运行命令之前的 6*24 小时和 7*24 小时之间的 24 小时期间进行比较。如果创建日期在该时间段内,并且文件名是“a1”、“a2”或“a3”,则find打印该文件的路径。由于 -ctime <n> 指定的时间段基于运行 find 命令的时间,因此如果明天运行 find 命令,则必须使用与今天运行 find 命令不同的值。

注意:如果您使用-ctime -6,find 将打印 6 天或更少天前的文件名,-ctime +6将打印 6 天或更早的文件名。另外,某些版本的 find 允许您指定测量单位,例如 6h,代表 6 小时。

-mtime如果您想搜索修改时间而不是创建时间,则可以使用。

使用xargs可以轻松检查在执行grep.另外,如果将 grep 放入-exec主数据库中, find 会为找到的每个文件调用一次它,而 则会xargs接收一个文件列表,并将其传递给 的单次调用grep,这样资源密集度较低。

一个缺点是-ctime您必须计算自文件创建以来的天数,但您可以通过运行来计算出

find . -ctime n | xargs ls -l

直到您看到包含您感兴趣的日期的文件。

...而且,您不必像删除-newer.

答案3

参考下面的截图,

在此输入图像描述

我们需要列出一个包含特定字符串且在特定日期创建的文件。我们可以为此执行以下命令,

  • 须藤查找。 -type f -newermt 2020-10-06 -exec grep -l“测试”{} \;

上面的命令将列出 10 月 6 日创建的文件,其中包含字符串“test”。参考下面的截图,

在此输入图像描述

在第一个屏幕截图中,您可以看到 3 个文件。其中两个(test.scala 和 text2.txt)包含字符串“test”,但它们的创建日期不同。在第二个屏幕截图中,您可以看到我们列出了包含字符串“test”且于 10 月 6 日创建的文件。

答案4

这将起作用:

$ grep -e JMS111 *20190221*.txt

相关内容