Estou tentando obter a última linha de um arquivo e excluí-lo:
Leia a linha:
sed -n '$p' file
# or
tail -n 1 file
Remova a linha:
sed -i '$d' file
Isso funciona, mas existe uma maneira de fazer isso com apenas um único comando ?
Estou tentando obter a última linha de um arquivo e excluí-lo:
Leia a linha:
sed -n '$p' file
# or
tail -n 1 file
Remova a linha:
sed -i '$d' file
Isso funciona, mas existe uma maneira de fazer isso com apenas um único comando ?
Qualquer que seja a sabedoria predominante, ter que ler um arquivo inteiro a cada vez para cortar sua última linha é estúpido , não importa se isso é feito em um único processo/comando ou dois ou três.
Ao contrário
sed -i
de ,tail
é inteligente o suficiente para não ler um arquivo desde o início para determinar qual é sua última linha; Além disso, o linux tem umtruncate(1)
utilitário, que combinado comtail
permite que você "explore" a(s) última(s) linha(s) de um arquivo enorme em tempo O(1):O objetivo é ter um único comando que produza a última linha de um arquivo e, ao mesmo tempo, exclua essa linha do arquivo original.
Isso executaria o seguinte
sed
script:Isso grava a última linha
/dev/stdout
e a exclui. Todas as outras linhas são gravadas de volta no arquivo original através da-i
opção.O script na linha de comando deve ser dividido em dois, pois não há como delimitar o nome do arquivo de saída do
w
comando (além de inserir uma nova linha literal).Com
ed
:ed
abre o arquivofile
e coloca o cursor na última linha do arquivo. O primeiro comando imprime essa linha na saída padrão, o segundo a exclui e o último comando grava o buffer de volta no arquivo. Usared
desta forma pode não ser aconselhável em arquivos grandes.