Bash 将某物作为命令的第一个输入

Bash 将某物作为命令的第一个输入,bash,unix,pipe,Bash,Unix,Pipe,这将返回“未找到文件abc”。 我想做的是找到abc的所有行。 我知道我可以简单地写作 echo 'abc' | grep input.txt 但是如果我想通过管道将输入传输到grep呢?您应该写: grep abc input.txt 如果要对其进行管道连接,请执行以下操作: grep "abc" input.txt 这也是可能的: cat input.txt | grep "abc" 或 因此,如果要使用echo命令,请执行以下操作: grep `command` input.txt

这将返回“未找到文件abc”。 我想做的是找到abc的所有行。 我知道我可以简单地写作

echo 'abc' | grep input.txt
但是如果我想通过管道将输入传输到grep呢?

您应该写:

grep abc input.txt
如果要对其进行管道连接,请执行以下操作:

grep "abc" input.txt
这也是可能的:

cat input.txt | grep "abc"

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

grep `command` input.txt

你也可以写:

grep `echo abc` input.txt

你可以用

var="abc" && grep $(echo $var) input.txt
cat input.txt | grep abc
grep然后在管道输入中搜索“abc”

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

var="abc" && grep $(echo $var) input.txt
cat input.txt | grep abc
作为输出搜索模式的命令。

您可以使用变量:

grep $(<command>) input.txt
我假设您从另一个命令中获得关键字abc,那么您也可以运行

var="abc" && grep "$var" input.txt
e、 在你上面的例子中,那将是

grep "$(command)" input.txt

我假设出现这个问题是因为在同一个文件中有一个关键字列表要搜索。这里有一种方法可以解决这个问题:

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

将$line而不仅仅是$line进行grepping可以查找包含空格的int点,而不是将dot解释为搜索int的另一个文件名。

以下内容将从stdin读取要搜索的内容:

$ 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
因此,您请求的行为:

grep -e "$(cat)" input.txt
…将正常工作。也就是说,你能描述一下用例吗?也许有更好的方法来完成你想要完成的事情

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

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


我得到了一些命令,可以把图案交给格雷普。我想先运行这些命令,然后使用grep对input.txt中的模式进行grep。在运行命令之前,我不知道模式是什么。abc只是一个例子。我想用管道传输“abc”部分,但不是文件名。你能解释一下为什么要这样做吗?这是可能的,但适当的技术取决于推理。为了避免对不同答案的重复,我将在这里澄清:您是说您要运行的命令会动态生成模式,并且您要根据这些模式检查文件?为了避免对不同答案的重复,我将在这里澄清:您是说您想要动态运行的命令生成模式,并且您想要根据这些模式检查文件吗?对!@用户2922049模式,复数,还是仅一个?这是一个重要的区别。@charlesduff我所说的模式只是一个词。第一个命令对我不起作用,子shell只是抱怨:-bash:cat:没有这样的文件或目录。我认为你不想要@IMSoP你完全正确;我确实想要$cat。需要更多的引号,否则命令的输出将是单词分割,并且除了发出的第一个单词外,所有其他单词都将被视为文件名。谢谢。现在已经修复了。目标是让abc在这种情况下以编程方式生成,所以这个答案不是很贴切。管道答案是我们的朋友想要的…我在顶部也使用了简单的答案///正如你所知,有很多解决方案…当每个关键字都可以一次通过时,为每个关键字运行单独的grep并不完全有效。
echo "abc" | grep -e "$(cat)" input.txt
grep -e "$(commands-to-get-the-pattern)" input.txt
echo 'abc' | grep -f - input.txt