É quase sempre relacionado ao cache de páginas .
Na primeira vez, os dados devem ser lidos (fisicamente) no disco.
A segunda vez (para arquivos não muito grandes) é provável que esteja no cache de páginas.
Assim, você pode emitir primeiro um comando como cat (1) para trazer o (não muito grande) arquivo no cache da página (ou seja, na RAM), então um segundo grep (1 ) (ou qualquer programa que leia o arquivo) geralmente seria executado mais rapidamente.
(no entanto, os dados ainda precisam ser lidos do disco em algum momento)
Veja também (às vezes útil em seus programas de aplicação, mas praticamente raramente) readahead (2) & posix_fadvise (2) e talvez madvise(2) & sync (2) & fsync (2) etc ....
Leia também LinuxAteMyRAM .
BTW, é por isso que é recomendado, quando comparamos um programa, executá-lo várias vezes. Além disso, é por isso que pode ser útil comprar mais RAM (mesmo que você não execute programas usando tudo isso para seus dados).
Se você quiser entender mais, leia um livro como, por exemplo, Sistemas operacionais: Três peças fáceis