Соблюдайте команду до тех пор, пока выходной сигнал не останется прежним. Обратная сторона `часов -г`

Я бы сделал

awk -F '\n' -v RS= '{f=substr($1, 2); for (i=3; i<=NF; i++) print $i > f}' file

Обратите внимание, что в языке awk -файл состоит из "записей", а запись содержит "поля". По умолчанию запись == одна строка, но это можно настроить.

При этом в качестве пустой строки используется переменная разделителя входных записей RS, что означает, что последовательности пустых строк разделяют записи. Я установил разделитель полей на новую строку. Вместе каждый «абзац» файла является записью, а каждая строка в абзаце — полем.

Вызов substrпросто опускает начальную точку с запятой.

На самом деле я не проверяю, что количество строк данных на самом деле равно значению «n» во 2-й ;строке.

2
13.01.2021, 23:10
1 ответ

Кажется, это работает (в Linux):

while :
do
    timeout 8 watch -g my-command my-args || break
done

ПРИМЕЧАНИЯ:

  1. вместо «количества прогонов», как вы сказали, это просто указывает количество секунд, в течение которых вывод должен быть одинаковым

  2. если my-commandне любит, когда его убивают во время работы, это может быть неподходящим, или, по крайней мере, значение тайм-аута и параметр часов -nнеобходимо настроить, чтобы уменьшить вероятность того, что это произойдет.

ПОЯСНЕНИЕ:

Основная идея заключается в том, что команда тайм-аута завершается с ошибкой (код выхода 124 ), если команда все еще выполняется по истечении тайм-аута. (Вы можете бежать

timeout 2 date; echo $?
timeout 2 sleep 3; echo $?

, чтобы увидеть это в действии.

Мы объединяем это с watch -g. Если часы выходят до тайм-аута (, т. е. произошло изменение выходных данных ), тайм-аут возвращается с кодом выхода 0, и цикл продолжается.

Если вывод не изменился в течение (в моем примере )8 секунд, часы будут убиты по тайм-ауту, и тайм-аут завершится с ошибкой и разорвет цикл.

2
18.03.2021, 22:37

Теги

Похожие вопросы