2

Вкратце: я пытаюсь создать другой вывод для ping, который лучше работает для некоторых вещей, которые я пытаюсь сделать. Для этого я перенаправляю вывод ping в sed, чтобы удалить все, кроме миллисекунд. Последняя часть написана на python, и она создает вывод. Вот код:

ping google.com | sed '/^[^=]*$/d;s/^[^=]*=[^=]*=[^=]*=//;s/ ms//' | python3 -c 'while True:
    l = [float(input()) for _ in range(10)]
    m = sum(l) / len(l)
    n = sum(abs(i - m) for i in l) / len(l)
    print("{}\t{}".format(m, n))'

Я попытался запустить его в fish и bash, и он не работает (=> Я не получаю вывод). Однако отдельные части работают, ping google.com | sed '/^[^=]*$/d;s/^[^=]*=[^=]*=[^=]*=//;s/ ms//' дает ожидаемый результат. Сценарий python выдает ожидаемый результат, если я использую cat для передачи файла в него.

1 ответ1

3

Как обычно, когда наблюдается такое поведение (без вывода или с задержкой вывода), это происходит из-за конвейерной буферизации. Ваша команда работает здесь, если вы sed должен быть "небуферизован" с флагом -u .

Вы можете изменить поведение буферизации отдельных программ с помощью программы stdbuf из coreutils , например, для использования строковой буферизации:

stdbuf -oL sed '...'

Кстати, если ваша версия grep поддерживает регулярные выражения Perl, вы можете добиться того же эффекта с помощью шаблона прогнозирования, например:

grep --line-buffered -oP '[0-9.]+(?= ms)'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .