double grep na cauda -f não dá saída

1

Se eu seguir um arquivo de alguma forma assim:

tail -f  /var/log/syslog|grep s

Eu vejo todas as linhas contendo um "s"

Por que isso não dá nenhuma saída, se eu o grep novamente para o mesmo "s"?

tail -f  /var/log/syslog|grep s|grep s
    
por rubo77 28.10.2014 / 20:33

2 respostas

3

Como Rubo77 mencionou, o problema é resolvido adicionando o --line-buffered ao primeiro comando grep:

tail -f  /var/log/syslog|grep --line-buffered s|grep s

No entanto, você pode perguntar por que isso não é necessário para um único comando grep ? A diferença entre os dois é que no seguinte comando:

tail -f  /var/log/syslog|grep s

STDOUT para grep é apontado para um terminal. grep provavelmente grava em STDOUT via funções contidas na biblioteca stdio. De acordo com a documentação ( stdio (3) ):

Output streams that refer to terminal devices are always line buffered by default;

Assim, as chamadas de biblioteca subjacentes estão liberando o buffer após cada linha sem qualquer ação na parte do grep.

Neste comando:

tail -f  /var/log/syslog|grep --line-buffered s|grep s

STDIO agora está indo para um pipe em vez de um dispositivo de terminal e as funções de biblioteca que o grep está usando para gravar em STDOUT armazenam completamente essas gravações em vez de usar o buffer de linha. Quando o sinalizador --line-buffered é usado, o grep chamará fflush , que liberará toda a gravação em buffer.

    
por 28.10.2014 / 21:47
3

Você precisa adicionar --line-buffered ao grep

tail -f  /var/log/syslog|grep --line-buffered s|grep s
    
por 28.10.2014 / 20:43