通过 xargs 将 sed 输出管道传输到 grep 时出现问题
Problems piping sed output to grep through xargs
我在将 sed
输出与 grep
到 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.67654
、file3.log
和 file3.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"'
但我不能让它工作(老实说,我不完全理解它)。我觉得我就在那里,但我错过了一个细节。有帮助吗?
如果文件名不包含空格或通配元字符 (* [ ]
)
只需添加@
,因为-I@
表示@
是要被argument
替换的token
grep -l "certainString" | sed "s/log/log*/g" | xargs -I@ sh -c 'grep -l "anotherString" @'
我在将 sed
输出与 grep
到 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.67654
、file3.log
和 file3.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"'
但我不能让它工作(老实说,我不完全理解它)。我觉得我就在那里,但我错过了一个细节。有帮助吗?
如果文件名不包含空格或通配元字符 (* [ ]
)
只需添加@
,因为-I@
表示@
是要被argument
grep -l "certainString" | sed "s/log/log*/g" | xargs -I@ sh -c 'grep -l "anotherString" @'