通过xargs将sed输出传递到grep的问题

时间:2019-04-03 11:07:10

标签: bash shell sed grep xargs

我在传送sedgrep用的xargs输出时遇到问题。我认为这是变量扩展的问题,但我不确定。

方案如下。当前目录包含以下文件:

file1.log
file1.log.67654
file2.log
file2.log.66876
file3.log
file3.log.56768
...

在这些文件中,只有一些以.log结尾的文件包含某个字符串,以便:

$ grep -l "certainString"
file1.log
file3.log

我想要找到的是这些文件中的多少个,或者以这些文件开头但具有额外的.numbers作为扩展名的文件(文件file1.logfile1.log.67654file3.logfile3.log.56768(在此示例中)包含另一个字符串。

我认为该命令可以做到:

grep -l "certainString" | sed "s/log/log*/g" | xargs grep -l "anotherString"

但是在我将log中的log*替换为sed之后,xargs不会展开*,而是从字面上解释它,因此:

$ grep -l "certainString" | sed "s/log/log*/g" | xargs grep -l "anotherString"
grep: ./file1.log*: No such file or directory
grep: ./file3.log*: No such file or directory

我已经读过有关此内容,人们建议使用类似的内容:

grep -l "certainString" | sed "s/log/log*/g" | xargs -I@ sh -c 'grep -l "anotherString"'

但是我无法使其正常工作(老实说,我并没有完全理解它)。我觉得我就在那里,但我错过了一个细节。有帮助吗?

1 个答案:

答案 0 :(得分:0)

如果文件名不包含空格或通配符(* [ ]

只需添加@,因为-I@意味着@是要用参数替换的令牌

grep -l "certainString" | sed "s/log/log*/g" | xargs -I@ sh -c 'grep -l "anotherString" @'