#!/bin/bash
tr '\n' ' ' < sample.txt | sed 's:=====:\n=====:g' | sed 's: *$::g' >tmp1
grep "author:john" tmp1 | sed 's: :\n\t:g' > test1.txt
grep "author:paul" tmp1 | sed 's: :\n\t:g' > test2.txt
rm tmp1
o comando "tr" substitui cada nova linha por um espaço (o arquivo inteiro é agora de 1 linha)
isso é canalizado para "sed", o que fará com que todos os "=====" iniciem em uma nova linha.
O segundo "sed" excluirá espaços à direita. Tudo isso é enviado para um arquivo temporário. Agora você tem 1 "registro" por linha.
O primeiro "grep" irá ler o arquivo temporário e produzir todos os registros onde "author" é "john", esses registros são canalizados para "sed" que substitui cada espaço por um newline-following-by-tab ( para reproduzir exatamente o layout do OP) e enviá-lo para um arquivo chamado test1.txt
O segundo idem do grep para "paul" e "test2.txt"
A última ação é excluir o arquivo temporário que não é mais necessário,