Se você deseja obter as correspondências, não é necessário usar um loop. Seria muito mais rápido usar apenas um único comando grep
:
grep -Ff input_strings service.log > results.txt
Dito isto, se você quiser fazer literalmente o que declarou em sua pergunta, pode usar uma variável para acompanhar a linha em que a última correspondência foi encontrada:
LINE_NUMBER=0
while read LINE; do
# Search for the next match starting at the line number of the previous match
MATCH="$(tail -n+${LINE_NUMBER} "service.log" | grep -n "${LINE}" | head -n1)";
# Extract the line number from the match result
LINE_NUMBER="${MATCH/:*/}";
# Extract the matching string from the match result
STRING="${x#*:}";
# Output the matching string
echo "${STRING}";
done < input_strings.txt > result.txt