Você pode usar sed ou awk para fazer isso com um comando. No entanto, você perderá velocidade, pois sed e awk precisarão percorrer todo o arquivo mesmo assim.
Do ponto de vista da velocidade, é muito melhor fazer uma função ou, a cada vez, a combinação de tail + head . Isto tem o lado negativo de não funcionar se a entrada for um pipe, no entanto você pode usar a substituição do processo, caso seu shell o suporte (veja o exemplo abaixo).
first_last () {
head -n 10 -- "$1"
tail -n 10 -- "$1"
}
e inicie-o como
first_last "/path/to/file_to_process"
para prosseguir com a substituição do processo (bash, zsh, ksh apenas como shells):
first_last <( command )
ps. você pode até adicionar um grep para verificar se suas "condições globais" existem.