考虑一个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
如何在 ONLY 这个文件子集中搜索线条模式?我想grep
为上述三个文件的每一行中的字符串WARNING
。如何告诉grep
将其搜索范围限制为仅此子集?
答案 0 :(得分:2)
-l
选项用于:匹配
-L
选项则相反:列出不匹配的文件
grep WARNING $(grep -l "Sep 29" *test.dat*)
我误解了这个问题:你不想要问候"警告"对于已经包含" 9月29日和#34;的文件,你想要grep"警告"在9月29日最后修改的文件。
因此我建议:
grep WARNING $(ll *test.dat* | grep "Sep 29")
但我不会依赖ll
输出。
答案 1 :(得分:1)
使用subshell:
grep "WARNING" $(ll *test* | grep "Sep 29")
这样,您的命令输出将成为最外层<files_to_search_in>
命令的grep
参数。
请记住,由于您在原始命令中使用ll
,因此它的输出不仅会为您提供所需的文件名,还会为您提供其他文件详细信息(权限,日期等)。您可能需要在“内部”grep
中进行进一步处理,以便传递给最外层grep
命令的信息将仅限于文件名。
在此期间,考虑使用find
命令(man page)而不是ll
的组合,在最内层的子shell中进行文件过滤+ grep
:使用正确的工具(
答案 2 :(得分:0)
另一种方法:
find . -type f -name "test.dat*" -newermt 2017-09-29 ! -newermt 2017-09-30 -exec grep WARNING {} \;
<强>详情
-type f
:仅搜索文件
-name "test.dat*"
:仅以“test.dat”开头的文件
-newermt 2017-09-29 ! -newermt 2017-09-30
:仅包含修改日期= 29 2017年9月的文件
-exec grep WARNING {} \;
:每次找到文件时,在其上执行grep WARNING