首页 > 解决方案 > 多个 grep 通配符顺序

问题描述

例子:

我有一个脚本

grep  "foo" /home/user_a/*/*_test >> list
grep -o "bar" /home/user_b/*/*_word >> list
printf "\n" >> list

如何运行两个 grep 以使 * 在同一个迭代中?

假设所有文件下/home/user_a只有一个字符串“foo”,而“bar”下的文件/home/user_b

如何得到这个:

foobar
foobar
foobar

代替:

foofoofoobarbarbar

我们可以把通配符想象成一个 for 循环,迭代所有匹配的文件。

不是在运行第二个 grep 之前等待第一个 grep 完成,而是第一个 grep 在第一个结果处停止并转到第二个 grep 并获得第一个结果,然后再次返回到第一个 grep,依此类推..

标签: awksedgrep

解决方案


如果要在两个命令的输出之间交替,grep在这种情况下为命令,则使用paste,如下所示:

paste <(grep -h "foo" /home/user_a/*/*_test) <(grep -ho "bar" /home/user_b/*/*_word)

由于您似乎不希望输出中的文件名,我将-h选项添加到两个 grep 命令。

更简单的例子

要查看如何paste组合两个不同命令的输出,请尝试以下操作:

$ paste <(echo a; echo b) <(echo 1; echo 2)
a       1
b       2

推荐阅读