Окремі деталі працюють, але трубопровідні дані через них розбиваються


2

Коротше кажучи: я намагаюся побудувати інший вивід для пінгу, який працює краще для деяких речей, які я намагаюся зробити. Для цього я виводжу вихід 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, і він не працює (= & gt; я не отримую виводу). Однак окремі частини працюють ping google.com | sed '/^[^=]*$/d;s/^[^=]*=[^=]*=[^=]*=//;s/ ms//' дає очікуваний випуск. Сценарій python дає очікуваний вивід, якщо я використовую cat, щоб вкласти в нього файл.


@ John1024 Виводить середнє та середнє відхилення, між якими розташовано вкладку. Але це не має значення. cmd1 | cmd2 > f слідом за ними cat f | cmd3 має бути еквівалентним cmd1 | cmd2 | cmd3. (З затримкою між виходами) Але в цьому випадку це не так, з якоїсь причини я не знаю.
CodenameLambda

@ John1024 Я не отримую виводу. Я оновлю питання.
CodenameLambda

Відповіді:


3

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

Можна змінити поведінку буферизації окремих програм за допомогою stdbuf програми від coreutils, напр. використовувати буферування рядків:

stdbuf -oL sed '...'

До речі, якщо ваша версія grep підтримує регулярні вирази Perl, ви можете досягти такого ж ефекту з шаблоном lookahead, наприклад:

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

Особливо мені подобається grep наданої вами опції, але у мене немає жодної підтримки для регулярних виразів Perl. Ви все ще можете використовувати grep хоч: grep --line-buffered -oE '[0-9.]+ ms' | grep --line-buffered -oE '[0-9.]+', але sed - це лише один дзвінок.
CodenameLambda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.