Linha de comando 'buffer' [duplicate]

3

Eu queria tail as últimas 100 linhas de um arquivo para o mesmo arquivo, mas o comando tail -n 100 file > file não funciona, eu suponho porque o stdout é gravado no arquivo 'live', antes de tudo ser lido no arquivo original.

Existe alguma maneira de canalizar a saída para algo , que a mantém até que todas as 100 linhas estejam lá e, em seguida, a envie para o arquivo? Ou apenas outra maneira de encurtar o arquivo dessa maneira?

    
por MadTux 31.07.2014 / 11:05

4 respostas

7

sponge de moreutils é bom para isso. Será:

soak up standard input and write to a file

Você usa assim:

tail -n 100 file | sponge file

para obter exatamente o efeito desejado.

    
por 31.07.2014 / 11:08
2

Claro, no momento em que finalmente faço a pergunta sobre SE, a resposta vem para mim. Eu acho que menos o que eu preciso, então eu apenas escrevo:

tail -n 100 file | less > file

    
por 31.07.2014 / 11:08
1

Em:

tail -n 100 file > file

O shell bifurca um processo, abre file para escrever nele, com truncamento (isto é, tornando-o um arquivo vazio) e, em seguida, executa tail nesse processo. Para abrir file sem truncamento, você pode usar o operador de redirecionamento <> :

tail -n 100 file 1<> file

O problema é que não haverá truncamento. Ou seja, file será substituído por suas últimas 100 linhas, mas depois dessas 100 linhas, o que estava originalmente no arquivo ainda estará lá. Então você precisaria chamar outro comando para fazer o truncamento após tail ter terminado.

{ tail -n 100 file; perl -e 'truncate STDOUT, tell STDOUT'; } 1<> file
    
por 31.07.2014 / 12:38
0

Você pode fazer assim:

printf '%s\n' "$(tail -n 100 file)" > file
    
por 31.07.2014 / 11:53