O shell é uma ferramenta perfeitamente adequada para este trabalho. Apenas tome cuidado para não distorcer espaços e barras invertidas.
while IFS= read -r line; do
if predicate "$line"; then printf '%s\n' "$line"; done
done
Você também pode usar o awk. Não deixe de citar cada linha, pois ela será passada para um shell (o snippet abaixo coloca aspas simples ao redor da linha e substitui as aspas simples na linha por '\''
; 7
is '
). Como cada chamada de comando passa por um shell, espero que seja mais lento que o método shell puro, mesmo que o awk provavelmente seja mais rápido nas linhas de análise. Mas eu não fiz nenhum benchmark.
awk '{quoted=$0; gsub(/7/, "7\\77")}
!system("predicate 7" $0 "7")'