Pokud máte k procházení 1 milion souborů, projdete (nejlépe vím) každý s regulárním výrazem.
Pro všechny záměry a účely skončíte tím, že uděláte totéž s řádky tabulky, pokud na ně budete hromadně dotazovat pomocí operátoru LIKE nebo regulárního výrazu.
Moje vlastní zkušenost s grep je, že málokdy hledám něco, co neobsahuje alespoň jedno celé slovo, takže možná budete moci využít databázi ke zmenšení množiny, ve které hledáte.
MySQL má nativní funkce fulltextového vyhledávání, ale nedoporučoval bych to, protože znamenají, že nepoužíváte InnoDB.
O těch z Postgresu si můžete přečíst zde:
http://www.postgresql.org/docs/current/static/textsearch .html
Po vytvoření indexu ve sloupci tsvector můžete provést svůj „grep“ ve dvou krocích, jedním okamžitě vyhledejte řádky, které by mohly nejasně splňovat podmínky, a poté dalším podle vašich skutečných kritérií:
select * from docs where tsvcol @@ :tsquery and (regexp at will);
To bude výrazně rychlejší, než cokoli dokáže grep.