Aqui está uma variação específica para todos os demais que chegam tarde a esta pergunta:
ls -1 src/*.c | xargs -i sh -c "echo;gcc -fpreprocessed -dD -E {} 2>&1 | grep -wi -e one -e two -e three -n | sed 's:^:{}\::'" | cat -s
Uma lista se os arquivos de origem C
ls -1 src/*.c
são canalizados para xargs, que executa o pré-processador em um shell filho
gcc -fpreprocessed -dD -E {} 2>&1
que é subsequentemente canalizado para um comando grep desejado
grep -wi -e one -e two -e three -n
que é então enviado ao sed para prefixar cada linha com o nome do arquivo atual
sed 's:^:{}\::'
Finalmente, todas as linhas em branco repetidas são reduzidas a linhas simples usando cat:
cat -s
Isso funciona em um sistema RHEL6, mas suponho que seja geral o suficiente para outros sistemas * nix.