salvando a saída de outro comando

5

Eu preciso selecionar certas linhas do arquivo de log e salvá-las em um arquivo de texto. Eu tentei o seguinte, mas nenhum deles está funcionando como esperado. O arquivo "todel.txt" mostra 0 bytes.

tail -f general.log | grep Some_word > >(tee -a todel.txt)

tail -f general.log | grep Some_word ; tee  todel.txt

tail -f general.log | grep Some_word | tee -a todel.txt
    
por shantanuo 18.11.2013 / 05:51

4 respostas

8

Você precisa adicionar stdbuf(1) ao seu pipeline:

tail -f general.log | stdbuf -oL grep Some_word | tee -a todel.txt

Isso definirá o modo de buffer de fluxo stdout de grep como buffer de linha, caso contrário, grep espera obter pelo menos 4096 bytes do fluxo (esse é o padrão no Linux para E / S armazenada em buffer). / p>

Como alternativa, você também pode chamar grep com --line-buffered :

tail -f general.log | grep --line-buffered Some_word | tee -a todel.txt

Veja Desativar o armazenamento em buffer no canal e link para explicações detalhadas.

    
por 25.11.2013 / 12:57
1

O terceiro deve funcionar bem, supondo que você tenha acesso para gravar arquivos no diretório atual.

Por exemplo: tail -f general.log | grep "Some_word" | tee todel.txt

Essa é a sintaxe tee adequadamente definida. Se não estiver funcionando, você está fazendo algo errado.

Além disso, é uma boa ideia colocar sua string de pesquisa entre aspas. Se você tiver um nome de arquivo correspondente à sua string de pesquisa no diretório de trabalho atual, ele poderá ser considerado um argumento de arquivo em vez de uma string de pesquisa.

    
por 18.11.2013 / 06:49
0
grep "my words" > mytextfile.txt
tail -f access.log > last_log.txt
tail -f access.log | grep "IP address" > hacker.log
    
por 18.11.2013 / 07:17
0

É possível que as linhas que você está procurando estejam sendo enviadas para stderr em vez de stdout , nesse caso finalizando linha com 2>&1 deve corrigir o problema:

tail -f general.log | grep Some_word | tee -a todel.txt 2>&1
    
por 25.11.2013 / 07:38

Tags