通过管道将某些内容作为命令的第一个输入


echo 'abc' | grep input.txt

这将返回"找不到文件 abc".
我想做的是找到所有带有abc的行。我知道我可以简单地写

grep abc input.txt

但是,如果我想通过管道将输入传输到 grep 怎么办?

以下内容将从标准输入中读取要搜索的内容:

grep -e "$(cat)" input.txt

因此,您请求的行为:

echo "abc" | grep -e "$(cat)" input.txt

。将正常工作。也就是说,您能描述一下用例吗?可能有更好的方法来完成你想要完成的事情。


好的 - 用例在其他地方的评论中得到了澄清。要使用的正确工具不是管道,而是命令替换:

grep -e "$(commands-to-get-the-pattern)" input.txt

您可以使用变量:

var="abc" && grep "$var" input.txt

我假设您从另一个命令中获取关键字abc,那么您也可以运行

grep "$(command)" input.txt

例如,在上面的示例中,这将是

grep "$(echo 'abc')" input.txt

你应该写:

grep "abc" input.txt

如果要通过管道传输它:

cat input.txt | grep "abc"

这也是可能的:

grep "$(command)" input.txt

grep `command` input.txt

因此,如果要使用echo命令,请执行以下操作:

grep "$(echo abc)" input.txt

grep `echo abc` input.txt

你也可以写:

var="abc" && grep `echo $var` input.txt

var="abc" && grep $(echo $var) input.txt

尝试:

echo 'abc' | grep -f - input.txt

我认为这个问题的出现是因为您有一个关键字列表要在同一文件中搜索。 以下是您可以采取的一种方法:

$ cat sought_words 
include
return
int dot
blah
$ cat sought_words | while read line; do echo "searching for" $line; grep -n "$line" stack_dots2.c; done
searching for include
1:#include <stdio.h>
2:#include <stdlib.h>
3:#include <string.h>
searching for return
20:      return 1;
28:  return 0;
searching for int dot
8:  int dotless_length = 30;
searching for blah

greping for "$line"而不仅仅是 $line 允许查找包括空格在内的int dot,而不是将dot解释为另一个文件名来搜索int

您可以使用

cat input.txt | grep abc

然后,grep 在管道输入中搜索"ABC"。

对于动态搜索模式,您可以使用

grep $(<command>) input.txt

<command>是输出搜索模式的命令。

相关内容

  • 没有找到相关文章

最新更新