tee e grep ao mesmo tempo (shell)?

1

Estou tentando executar um servidor que grava em $ log (um arquivo txt) e, em seguida, localizar todo o texto no arquivo de log que começa com '[1]' e colocá-lo em outro arquivo. Aqui está minha tentativa. tee -a $log funciona junto com todo o resto. O comando grep não é assim.

run="tail -n0 -f -s 0.01 $cmds | (while true; do $tron --userconfigdir $userconfigdir --userdatadir $userdatadir --vardir $var; done) | tee -a $log | grep '^[1]' > ${var}logs/chatlogs.log"

O que pode ser feito para copiar todo o texto de tee -a $log começando com '[1]' para outro arquivo?

    
por dukevin 31.07.2011 / 10:57

4 respostas

3

Não coloque comandos em strings. A maneira de definir comandos compostos é funções.

Em seguida, lembre-se da regra mais importante da programação de shell: sempre coloque aspas duplas em torno das substituições de variáveis, por exemplo, "$foo" .

Você tem o seguinte código (confiando nas variáveis cmds , log , tron , userconfigdir , userdatadir e var ):

run () {
  tail -n0 -f -s 0.01 "$cmds" |
  while true; do
    "$tron" --userconfigdir "$userconfigdir" --userdatadir "$userdatadir" --vardir "$var"
  done |
  tee -a "$log" |
  grep '^[1]' > "${var}logs/chatlogs.log"
}

Agora que o código está em um formato legível, você pode ver que $tron está sendo executado em um loop infinito. Eu não sei o que você realmente quer fazer, mas você precisa colocar uma condição de finalização nesse loop.

    
por 02.08.2011 / 00:11
1

[...] são operadores para listas de caracteres. Você provavelmente quer fazer grep '^\[1\]' .

    
por 31.07.2011 / 11:04
0

Eu acho que deveria ser o suficiente se você escapar dos colchetes: grep '^\[1\]'

    
por 31.07.2011 / 11:04
0

Primeiro, use a opção de depuração do shell set -vx para ver como / quando as versões, etc. estão sendo avaliadas.

Desculpe, mas por que você tem sua configuração de código como

 run="..."? 

porque depois usar a variável $run ?

Se sim, então você quase certamente precisa fazer

eval "$run"

que está abrindo uma nova lata de worms, tanto quanto escapar de caracteres especiais. Como outro comentarista aponta, você não apenas terá que escapar dos personagens requeridos, você terá que escapar duplamente deles. Quando eu costumava fazer com que coisas assim funcionassem, eu poderia acabar com fugas como \\\ (5!) Para fazer as coisas funcionarem.

Sem mais explicações sobre o contexto desse código, minha recomendação é deixar de fora o material run= e apenas executar tail -n0 -f -s 0.01 $cmds |.... como está.

Além disso, por comentário de Gilles, e para amplificá-lo, todo o seu cachimbo não faz muito sentido,

 tail -n0 -f -s 0.01 $cmds | (while true; do $tron ....

nós não sabemos o que está em $cmds

Não há nada que eu possa ver dentro da sub-shell (while true; ...) que está lendo a saída da cauda cmd. Se você disser que é passado para o subseqüente tee após o final do while , eu aprendi algo novo.

C. Você realmente quer executar o comando $ tron o mais rápido possível em um loop infinito? Em muitos sistemas, isso acabará consumindo pelo menos 1 CPU com capacidade total. Talvez adicione um sleep 1 ?

Adicionar mais contexto sobre o que você está tentando realizar nos ajudará a ajudar você. Boa sorte.

    
por 09.08.2011 / 19:05