As partes individuais funcionam, mas os dados de tubulação através delas quebram

2

Resumindo: Estou tentando construir outra saída para ping, que funciona melhor para algumas coisas que estou tentando fazer. Para isso, canalizo a saída do ping para sed, para remover tudo, exceto os milissegundos necessários. A última parte é escrita em python e cria a saída. Aqui está o código:

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))'

Eu tentei executá-lo em fish e bash, e não funciona (= > não recebo saída). As partes individuais funcionam, no entanto, ping google.com | sed '/^[^=]*$/d;s/^[^=]*=[^=]*=[^=]*=//;s/ ms//' produz o resultado esperado. O script python produz a saída esperada se eu usar cat para enviar um arquivo para ele.

    
por CodenameLambda 22.10.2016 / 22:40

1 resposta

3

Como de costume, quando esse comportamento é observado (sem saída ou saída atrasada), isso ocorre devido ao buffer de pipeline. Seu comando funciona aqui se você instruir sed a ser "unbuffered" com o sinalizador -u .

Você pode alterar o comportamento de buffer de programas individuais com o programa stdbuf de coreutils , por exemplo, para usar o buffer de linha:

stdbuf -oL sed '...'

A propósito, se a sua versão de grep suportar expressões regulares Perl, você poderá obter o mesmo efeito com um padrão lookahead, por exemplo:

grep --line-buffered -oP '[0-9.]+(?= ms)'
    
por 23.10.2016 / 02:56