Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Linux 具有数字扩展名的Grep文件_Linux_Bash_Grep - Fatal编程技术网

Linux 具有数字扩展名的Grep文件

Linux 具有数字扩展名的Grep文件,linux,bash,grep,Linux,Bash,Grep,考虑一个包含20个文件的目录,编号如下: ll *test* > test.dat > test.dat.1 > test.dat.2 ... > test.dat.20 与给定日期匹配的文件子集可以通过 ll *test* | grep "Sep 29" > test.dat > test.dat.1 > test.dat.2 如何仅在该文件子集中搜索线型?我想对上述三个文件的每一行中的字符串WARNING进行grep。我如何告诉grep将其搜索限

考虑一个包含20个文件的目录,编号如下:

ll *test*
> test.dat
> test.dat.1
> test.dat.2
...
> test.dat.20
与给定日期匹配的文件子集可以通过

ll *test* | grep "Sep 29"
> test.dat
> test.dat.1
> test.dat.2

如何仅在该文件子集中搜索线型?我想对上述三个文件的每一行中的字符串
WARNING
进行
grep
。我如何告诉
grep
将其搜索限制为仅此子集?

-l
选项用于:列出匹配的文件

-L
选项的作用正好相反:列出不匹配的文件

grep WARNING $(grep -l "Sep 29" *test.dat*)
编辑 我误解了这个问题:你不想在已经包含“Sep 29”的文件上grep“WARNING”,你想在上次修改的文件上grep“WARNING”

因此,我建议:

grep WARNING $(ll *test.dat* | grep "Sep 29")
但我不会依赖于输出。

使用:

grep“WARNING”$(ll*test*| grep“Sep 29”)

这样,命令的输出将成为最外层的grep命令的
参数

请记住,由于您在原始命令中使用的是
ll
,因此它的输出不仅会提供所需的文件名,还会提供其他文件详细信息(权限、日期等)。您可能需要在“内部”grep
grep
中进行进一步处理,以便传递给最外部的grep
grep
命令的信息将仅限于文件名


此时,考虑使用
find
命令(而不是
ll
+
grep
)在最内层的子shell中进行文件过滤:使用正确的工具进行作业(:

另一种方法:

find . -type f -name "test.dat*" -newermt 2017-09-29 ! -newermt 2017-09-30 -exec grep WARNING {} \;
详细信息

-键入f
:仅搜索文件

-名称“test.dat*”
:仅以“test.dat”开头的文件

-newermt 2017-09-29!-newermt 2017-09-30
:仅修改日期为2017年12月29日的文件


-exec grep WARNING{}\
:每次找到一个文件时,对其执行
grep WARNING
,谢谢,我会尝试
find
谢谢,但我得到以下
find:invalid predicate
-newermt'`不幸的是,您的
find
似乎不支持
-newermt
:(那么你可以找
-mtime
。你需要做一些计算,但这肯定是可行的(之前可能在这里被问过很多次,所以你可以用谷歌搜索)。