Estou seguindo um arquivo de log com o sinalizador -f. Então, eu estou colocando isso no grep, para encontrar apenas linhas que contenham "X". Isso está funcionando perfeitamente bem. Agora quero canalizar isso novamente para outro grep, que removerá todas as linhas que contêm "Y". Quando adiciono o segundo canal, o arquivo para de atualizar e parece que não há dados chegando.
Este é o comando que funciona: tail -f my_file.log | grep "X"
Este é o comando que não: tail -f my_file.log | grep "X" | grep -v "Y"
Como devo estruturar isso para que o comando funcione?
command-line
grep
Ori Horev
fonte
fonte
tail -f file|grep -v "Y"
. se a saída estiver correta, prossiga para acrescentargrep "X"
.Respostas:
Como a saída de
grep
é armazenada em buffer, use a--line-buffered
opção degrep
para ativar o buffer de linha:Se o seu
grep
não tiver a opção, você pode usarstdbuf
como alternativa:fonte
stdbuf
informalibstdbuf.so
quais configurações usar.diff -u <(env) <(stdbuf env)
e não encontrei nenhuma. Mas agora percebo que o que eu deveria ter testado eradiff -u <(env) <(stdbuf -oL env)
.tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb'
não está dando saída. Podes ajudar-me, por favor.Normalmente, acho mais útil
awk
para esse tipo de verificação lógica:Testado com duas abas, uma na qual continuo escrevendo
seq 20 >> myfile
e a outra, por exemplotail -f myfile | awk '/3/ && !/13/'
.fonte
Outra abordagem seria usar uma única
grep
invocação em vez de duas e assim evitar o problema de buffer. Basta usar expressões regulares que correspondam a linhas que consistem em 0 ou mais caracteres que não sejam Y, depois um X e, em seguida, 0 ou mais que não Ys até o final da linha "fonte