2014-02-16 30 views
-1
echo 'abc' | grep input.txt 

這會返回'找不到文件abc'。
我想要做的就是用abc找到所有的所有行。 我知道我可以簡單地寫管道作爲命令的第一個輸入

grep abc input.txt 

但如果我想管道輸入到grep?

+0

你能解釋爲什麼* *你想這樣做?這是可能的,但適當的技術取決於推理。 –

+0

爲了節省不同答案上的重複,我會在這裏澄清一下:你是否說你想要運行的命令動態生成模式,並且你想檢查一個文件來對付這些模式? – IMSoP

+0

爲了保存不同答案的重複,我會在這裏澄清一下:你是說你想要運行的命令動態生成模式,並且你想檢查一個文件來對付這些模式?是! – user2922049

回答

1

你應該寫:

grep "abc" input.txt 

如果你想管它:

cat input.txt | grep "abc" 

這是可能的:

grep "$(command)" input.txt 

OR

grep `command` input.txt 

所以,如果你想使用echo命令做到這一點:

grep "$(echo abc)" input.txt 

OR

grep `echo abc` input.txt 

你也可以這樣寫:

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

OR

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

和你一起學習貓的無用用... –

+0

目標是讓'abc'在這種情況下以編程方式生成,所以這個答案不是很明顯。 –

+0

管道答案就是我們的朋友想要的......而且我還在頂部使用了簡單的答案///如你所知,有很多解決方案...... – MLSC

0

您可以使用

cat input.txt | grep abc 

grep然後在管道輸入內搜索'abc'。

對於動態搜索模式可以使用

grep $(<command>) input.txt 

<command>是輸出所述搜索模式的命令。

+0

我有一些命令讓模式變爲grep。我想先運行這些命令,然後使用grep來grep input.txt中的模式。在運行命令之前,我不知道該模式是什麼。 abc只是一個例子。我想管'ABC'部分,但不是他的文件名。 – user2922049

2

可以使用變量:

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

我假設你的關鍵字abc了另一個命令,那麼你也可以運行

grep "$(command)" input.txt 

例如在你上面的例子中,那將是

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

需要更多的引號,否則'command'的輸出將被分詞,並且除了第一個字以外的所有字都將被視爲文件名。 –

+0

謝謝。現在已經修復了。 – pfnuesel

0

我想這個問題是因爲你有一個關鍵字列表在同一個文件中搜索。以下是你可能會去的一種方式:

$ 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 

grepping爲"$line",而不是僅僅$line允許發現int dot包括空間,而不是解釋dot爲另一個文件名中搜索int

+0

對於每個關鍵字運行單獨的grep並不完全有效,因爲它們都可以通過一次完成。 –

2

以下將讀取的內容,搜索從標準輸入:

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

因此,您所要求的行爲:

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

...會正常工作。那就是說,你能描述一下用例嗎?可能有更好的方法來完成你想要完成的任務。


好的 - 在其他地方的評論中澄清了用例。使用正確的工具是不是一個管道,但命令替換:

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

第一個命令不適合我,子shell只是抱怨:'-bash:cat:沒有這樣的文件或目錄。我認爲你不需要那裏的'<',只是'「$(cat)」'。 – IMSoP

+0

@IMSoP你完全正確;我確實想要'$(貓)'。 –

1

嘗試:

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

非常好... + 1 !!! – MLSC