Você pode usar uma construção while para fazer um loop pelos padrões de file2 e usar -m 1 com grep para parar após a primeira correspondência em file1 :
while IFS= read -r i; do grep -Fm1 "$i" file1; done <file2
-
-Ftrata o padrão literalmente -
-m 1fazgrepsair depois da primeira correspondência
Os loops de shell geralmente não são eficientes, mas, considerando que a lista de padrões é pequena, é possível utilizá-lo.
Alternativa mais rápida , xargs :
xargs -a file2 -n1 -P2 -I'{}' grep -Fm1 {} file1
Use mais processos paralelos ( -P ) para mais padrões.
Exemplo:
% while IFS= read -r i; do grep -Fm1 "$i" file1; done <file2
my colour is red
my colour is blue
% xargs -a file2 -n1 -P2 -I'{}' grep -Fm1 {} file1
my colour is blue
my colour is red