2012-11-06 73 views
2

我有一個文件,其中包含100個字符串,每個strings.txt一行grep的許多不同的字符串

string1 
string2 
... 
string100 

對於每一個這些字符串的,我想找到file_to_look.txt含有該字符串的所有行。現在,我可以運行grep 100次,比如grep string1 file_to_look.txt,然後grep string2 file_to_look.txt等等,但是這對我來說需要很多打字時間。

有沒有一種方法,我不必這麼多的打字?

編輯:通過file_to_look.txt只有一次而不是100次的解決方案將是偉大的,因爲我的file_to_look.txt是相當大的。

回答

4

-f是用於使(GNU)用grep一個模式文件。只有

#!/bin/bash 

file_name=string.txt 
file_to_look=file_to_look.txt 
patterns=$(tr '\n' '|' $filename) 
patterns=${patterns%?} # remove the last | 
grep -E $patterns $file_to_look 

這回合在所有的搜索模式一起並把它關到grep一氣呵成與-E選項,所以grep

grep -f strings.txt file_to_look.txt 
+0

這似乎是最優雅的做法; +1 –

+0

是否通過輸入文件1次或100次? –

+0

它讀取一次模式文件,然後掃描輸入文件一次,所以只有一次。 –

0
while read line; do grep "$line" file_to_look.txt; done < strings.txt 

這正是你所要求的。替代「;」換你認爲合適的換行符。

xargs是人們建議的另一種選擇。我的建議是首先尋找另一種替代方案,因爲xarg有一些陷阱,可能會使事情變得非常錯誤。

Greg's bash wiki on xargs

0

通常xargs的用於與多個值重複命令:

xargs -I{} grep {} file_to_look.txt < strings.txt 
0

你可以用下面這個簡短的腳本做必須通過file_to_look.txt解析一次,而不是100次。