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>
是输出搜索模式的命令。