首页 > 解决方案 > 通过 xargs 将 sed 输出传送到 grep 的问题

问题描述

我在管道sed输出与grepthrough一起使用时遇到问题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.log和)包含另一个字符串。file1.log.67654file3.logfile3.log.56768

我认为这个命令会做到这一点:

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

但是在我用logwithlog*替换之后sedxargs并没有扩展,*而是从字面上解释它,因此:

$ 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"'

但我不能让它工作(老实说,我不完全理解它)。我觉得我就在那里,但我错过了一个细节。有什么帮助吗?

标签: bashshellsedgrepxargs

解决方案


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

只需添加@, 因为-I@意味着这@是一个要被参数替换的标记

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

推荐阅读