Diga ao awk para imprimir entre os dois delimitadores. Especificamente:
awk '/\*{4,}/,/<np>/' file
Isso também imprimirá as linhas contendo os delimitadores, para que você possa removê-las com:
awk '/\*{4,}/,/<np>/' file | tail -n +2 | head -n -1
Como alternativa, você pode definir uma variável como true se uma linha corresponder ao primeiro delimitador e a false quando corresponder à segunda e só imprimir quando for verdadeira:
awk '/\*{4,}/{a=1; next}/<np>/{a=0}(a==1){print}' file
O comando acima definirá a
para 1 se a linha atual corresponder a 4 ou mais *
e também passará para a linha next
. Isso significa que a linha ***
nunca será impressa.
Isto foi em resposta à versão original, mal compreendida, da questão. Estou deixando aqui, pois pode ser útil em uma situação ligeiramente diferente.
Primeiro de tudo, você não quer o FS
(separador de campo), você quer RS
(separador de registro). Então, para passar um literal *
, você precisa escapar duas vezes. Uma vez para escapar do *
e uma vez para escapar da contrabarra (caso contrário, o awk tentará igualá-lo da mesma forma que \r
ou \t
). Então, você imprime a segunda "linha":
$ awk -vRS='\*\*\*' 'NR==2' file
thingsIwantToRead1
thingsIwantToRead2
thingsIwantToRead3
Para evitar as linhas em branco ao redor da saída, use:
$ awk -vRS='\n\*\*\*\n' 'NR==2' file
thingsIwantToRead1
thingsIwantToRead2
thingsIwantToRead3
Observe que isso pressupõe um% ***
após cada parágrafo, não apenas após o primeiro, conforme mostrado.