Como posso descartar as últimas n linhas de um arquivo com um filtro de linha de comando unix?
Isso seria uma espécie de oposto de tail
: tail
descarta as primeiras n linhas, mas canaliza o resto, mas eu quero que o comando canalize tudo exceto as últimas n linhas.
Infelizmente não encontrei nada assim - head
não ajuda também. EDITAR : Pelo menos no Solaris ele não aceita argumentos negativos.
Atualização: estou mais interessado em uma solução que funciona para arquivos grandes, ou seja, arquivos de log, onde você pode querer inspecionar o que aconteceu nos últimos minutos.
Respostas:
Se você tem o GNU
head
, você pode usarpara imprimir todos, mas as últimas 5 linhas de
file.txt
.E se
head -n
não leva argumentos negativos, tentefonte
file.txt
tem pelo menos seis linhas de comprimento ...)head
, uma saída vazia é retornada, sem erros.Aqui está uma maneira simples de apagar a última linha, que funciona no BSD, etc.
A expressão lê "na última linha, apague-a". As outras linhas serão impressas, uma vez que é
sed
comportamento padrão.Você poderia encadear juntos para remover várias linhas
Que é um pouco pesado, reconhecidamente, mas faz apenas uma varredura através do arquivo.
Você também pode dar uma olhada nisso, para mais respostas: https://stackoverflow.com/questions/13380607/how-to-use-sed-to-remove-last-n-lines-of-a-file
Aqui está um one-liner adaptado de um dos meus favoritos lá:
Eu me diverti decifrando aquele, e espero que você também o faça (: Faz buffer
N
linhas como digitaliza, mas por outro lado é bastante eficiente.fonte
fonte
Estou curioso porque você pensa
head
não é uma opção:Isso parece se encaixar no seu propósito, usando, por exemplo:
fonte
head
. BSDhead
não tem essa opção, então essa resposta não trabalho no Solaris ou outros Unixes sem GNU coreutils. O OP especificamente marcou isso com Unix e Unix-Utils também.Outra maneira de fazer isso se
tail -n
não terá argumentos negativos éIsso removeria as últimas 5 linhas
fonte