Seria melhor você usar substituição de processo em vez de uma variável:
while read line; do
....
done < <(grep -E 'INPUT.*ACCEPT' $FILE)
(note dois caracteres < ). Isso evita o carregamento de toda a saída grep na memória de uma só vez para armazenar em uma variável. O processo grep será executado em paralelo com o loop, e o loop verá a saída de grep como entrada de read à medida que cada linha é impressa (até o buffer).
Isso tenderá a ser mais rápido e usar menos memória do que usar a substituição do comando $(...) e manter toda a saída ao redor. Também é geralmente melhor estilo se você estiver escrevendo um script específico do Bash, porque é explícito sobre o que você está usando o comando.
Indiscutivelmente, isso é um pouco um antipadrão para começar - talvez seja melhor ainda usar um pipeline comum para qualquer processamento que você precisar, em vez de while read ... e processá-lo no Bash, mas há casos válidos para usar .