2013-11-04 48 views
3

我的虛擬文件看起來像這樣grep的文件內容

cat dummy_file 
    Tom 
    Jerry 

我的管道內容看起來像這樣

COMMAND | 
    Tom Cat 
    Jerry Mouse 
    Spike Dog 

我想grep只有那些管道線是在dummy_file
我可以通過創建中間文件來做到這一點。

COMMAND > intermediate_file 
grep -w -F -f dummy_file intermediate file 
    Tom Cat 
    Jerry Mouse 

我該如何在不創建中間文件的情況下實現這一點,而只需grep'ing管道內容?
試過,但它不工作:

COMMAND | 
    xargs -I {} grep -w -F -f dummy_file -- NO RESULT 

或者這樣:

COMMAND | 
    xargs -I {} grep {} -w -F -f dummy_file -- ALL LINES ARE PRINTED 
+1

你可以通過管道輸出你的命令並調用grep: 命令| grep「regex」 –

+0

例如: ps aux | grep root –

+0

@Giudude謝謝!雖然這會更困難。 – PoGibas

回答

2

grep接受來自stdin的輸入。只要做

COMMAND | grep -w -F -f dummy_file 
0

你可以使用join命令;)

join --nonocheck-order -j1 <(COMMAND|sort) <(cat dummy_file|sort)|cut -d -f1 
# -j1 indicates the column to join in the two commands output 
# it's equivalent to -11 -11 (first and second output) 
# cut to print only the first column which is common to two orders 

詳情請參閱man join

+0

這只是巧合的工作,因爲'加入'加入到指定的列,雖然確實是特定數據集在第1列中具有所需的信息,但一般來說,數據可能正在查找第1列或第2列或第15列。 ..和'加入'真的不會處理。 –

+0

@JonathanLeffler這就是爲什麼我們需要一個完整的數據集來提出最佳解決方案。否則,我會提出一個替代方案...即使這意味着要進行一些調整(或完全改變解決方案),它仍然可以使用。 –