Se eu estou entendendo a pergunta corretamente, você pode fazer isso com um comando grep.
Para a primeira parte, sua saída grep pode suprimir o nome do arquivo usando -h , por exemplo:
grep -hnr "the_string" /media/slowly/DATA/lots_of_files > output.txt
Para Q1b, sua saída grep pode incluir linhas precedendo e seguindo linhas correspondentes usando -A e -B , por exemplo:
grep -hnr -A2 -B2 "the_string" /media/slowly/DATA/lots_of_files > output.txt
A saída conterá um separador entre correspondências, que você pode suprimir com --no-group-separator , por exemplo:
grep -hnr -A2 -B2 --no-group-separator "the_string" /media/slowly/DATA/lots_of_files > output.txt
Observe que a saída usa um delimitador diferente para linhas correspondentes ( : ) e linhas de contexto ( - ).