Я бы сделал
awk -F '\n' -v RS= '{f=substr($1, 2); for (i=3; i<=NF; i++) print $i > f}' file
Обратите внимание, что в языке awk -файл состоит из "записей", а запись содержит "поля". По умолчанию запись == одна строка, но это можно настроить.
При этом в качестве пустой строки используется переменная разделителя входных записей RS
, что означает, что последовательности пустых строк разделяют записи. Я установил разделитель полей на новую строку. Вместе каждый «абзац» файла является записью, а каждая строка в абзаце — полем.
Вызов substr
просто опускает начальную точку с запятой.
На самом деле я не проверяю, что количество строк данных на самом деле равно значению «n» во 2-й ;
строке.
Кажется, это работает (в Linux):
while :
do
timeout 8 watch -g my-command my-args || break
done
ПРИМЕЧАНИЯ:
вместо «количества прогонов», как вы сказали, это просто указывает количество секунд, в течение которых вывод должен быть одинаковым
если my-command
не любит, когда его убивают во время работы, это может быть неподходящим, или, по крайней мере, значение тайм-аута и параметр часов -n
необходимо настроить, чтобы уменьшить вероятность того, что это произойдет.
ПОЯСНЕНИЕ:
Основная идея заключается в том, что команда тайм-аута завершается с ошибкой (код выхода 124 ), если команда все еще выполняется по истечении тайм-аута. (Вы можете бежать
timeout 2 date; echo $?
timeout 2 sleep 3; echo $?
, чтобы увидеть это в действии.
Мы объединяем это с watch -g
. Если часы выходят до тайм-аута (, т. е. произошло изменение выходных данных ), тайм-аут возвращается с кодом выхода 0, и цикл продолжается.
Если вывод не изменился в течение (в моем примере )8 секунд, часы будут убиты по тайм-ауту, и тайм-аут завершится с ошибкой и разорвет цикл.