Нет функции gawk, чтобы соответствовать одному и тому же шаблону несколько раз в строке. Если вы точно не знаете, сколько раз шаблон повторяется.
Имея это, вы должны выполнять итерации "вручную" для всех совпадений в одной строке. Для вашего примера ввода это будет:
{
from = 0
pos = match( $0, /Hello! ([0-9]+)/, val )
while( 0 < pos )
{
print val[1]
from += pos + val[0, "length"]
pos = match( substr( $0, from ), /Hello! ([0-9]+)/, val )
}
}
Если шаблон должен совпадать с переводом строки, вы должны изменить разделитель входной записи - RS