Como manter sobrescrevendo o conteúdo de um arquivo em vez de anexá-lo a ele

2

Como faço para limpar o conteúdo de um arquivo antes de escrevê-lo? Por exemplo:

echo one > filename.tmp
# filename.tmp now contains "one"

echo two > filename.tmp
# filename.tmp should now contain "two", not "one" and "two"

Meu objetivo é:

  1. Iniciar um ouvinte

    $ nc -l 7007 > /var/tmp/test.log
    
  2. Envie alguns dados

    $ telnet localhost 7007
    hi
    second_word
    
  3. Teste o arquivo

    $ cat /var/tmp/test.log
    second_word
    

Eu não quero que o "hi" apareça no log; Eu quero que "second_word" o substitua

    
por YumYumYum 04.10.2011 / 12:52

2 respostas

3

Você precisa de um programa separado para limpar e gravar o novo arquivo, já que o nc não oferece essa opção.

nc -l 7007 | while true; do
    while read line; do
      echo "$line" > /tmp/test
    done
done

Você pode salvar tudo depois do pipe em um script separado que aceita um caminho de arquivo.

save-last-line.sh

while true; do
    while read line; do
        echo "$line" > $1
    done
done

Então é simples:

nc -l 7007 | save-last-line.sh /var/tmp/test.log

Você desejará adicionar verificações para garantir que $1 seja gravável e mostre o uso quando $1 não for especificado.

    
por 04.10.2011 / 14:31
1

command > /path/to/file limpará o arquivo e gravará a saída de command .

Quando você não deseja limpar o arquivo, é command >> /path/to/file .

Uma coisa a ter em conta é a opção noclobber no seu shell. Isso impedirá que você limpe arquivos com o operador > . Você pode substituir a opção usando >! , ou pode desabilitá-la com set +o noclobber .

Tente isso na sua linha de comando:

# echo "Hello, " > /tmp/test
# cat /tmp/test
  Hello
# echo "U&L" > /tmp/test
# cat /tmp/test
  U&L
# echo "Hello," > /tmp/test
# echo "U&L" >> /tmp/test
# cat /tmp/test
  Hello,
  U&L
# 
    
por 04.10.2011 / 13:00