使用grep搜索多个字符串,但保持顺序

时间:2014-10-14 21:57:53

标签: linux bash grep

我正在寻找一种方法来使用grep搜索多个字符串但保持相同的顺序。所以,例如,如果我有这个命令:

egrep '(string1|string2|string3)' /some/file.txt

我可能会回来:

string2
string1
string3

取决于它们在文件中的顺序。我需要的是无论在文件中的哪个位置找到它们总是返回:

string1
string2
string3

如果没有找到,发现它什么也没有返回,但订单仍然保持不变:

string1
string3

3 个答案:

答案 0 :(得分:3)

如果可以订购输出(即string1< string2< string3),您可以执行以下操作:

egrep '(string1|string2|string3)' /some/file.txt | sort

如果无法订购,或用三种不同的grep搜索它们:

egrep 'string1' /some/file.txt
egrep 'string2' /some/file.txt
egrep 'string3' /some/file.txt

或使用数组和for循环:

stringsToSearch=(string1 string2 string3)

for item in ${stringsToSearch[*]}
do
egrep '$item' /some/file.txt
done

答案 1 :(得分:1)

扫描一次,然后依次打印每个表达式的匹配项。如果输入匹配多个表达式,则会在匹配的第一个集合中列出。

我使用冒号作为表达分隔符;显然,你可以随意改变。

awk -v 'expr=string1:string2:string3' '
    BEGIN { n=split(expr, e, /:/);
      for(i=i; i<=n; ++i) m[i]="" }
    { for(i=1; i<=n; ++i) if ($0 ~ e[i]) {
      m[i]=m[i] $0 ORS; next } }
    END { for (i=1; i<=n; ++i) printf m[i] }' file

答案 2 :(得分:0)

如何一次一个地自动完成:

echo&#34; string1 string2 string3&#34; | xargs -n 1 -J%egrep%/some/file.txt