linux - ultima - sed substituir caracteres especiais/




Como usar sed para remover as últimas n linhas de um arquivo (14)

A maioria das respostas acima parece requerer comandos / extensões do GNU:

    $ head -n -2 myfile.txt
    -2: Badly formed number

Para uma solução ligeiramente mais portável:

     perl -ne 'push(@fifo,$_);print shift(@fifo) if @fifo > 10;'

OU

     perl -ne 'push(@buf,$_);END{print @buf[0 ... $#buf-10]}'

OU

     awk '{buf[NR-1]=$0;}END{ for ( i=0; i < (NR-10); i++){ print buf[i];} }'

Onde "10" é "n".

Eu quero remover algumas linhas n do final de um arquivo. Isso pode ser feito usando sed?

Por exemplo, para remover linhas de 2 a 4, posso usar

$ sed '2,4d' file

Mas eu não sei os números de linha. Posso apagar a última linha usando

$sed $d file

mas eu quero saber o caminho para remover n linhas do final. Por favor, deixe-me saber como fazer isso usando sed ou algum outro método.


Apenas para completar, gostaria de adicionar minha solução. Eu acabei fazendo isso com o ed padrão:

ed -s sometextfile <<< $'-2,$d\nwq'

Isso exclui as duas últimas linhas usando a edição no local (embora use um arquivo temporário em /tmp !!)


Dos sed-one-liners :

# delete the last 10 lines of a file
sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # method 1
sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # method 2

Parece ser o que você está procurando.


Eu não sei sobre sed , mas isso pode ser feito com a head :

head -n -2 myfile.txt

Eu vim com isso, onde n é o número de linhas que você deseja excluir:

count=`wc -l file`
lines=`expr "$count" - n`
head -n "$lines" file > temp.txt
mv temp.txt file
rm -f temp.txt

É uma pequena rotunda, mas acho que é fácil de seguir.

  1. Conte o número de linhas no arquivo principal
  2. Subtraia o número de linhas que você deseja remover da contagem
  3. Imprima o número de linhas que você deseja manter e armazenar em um arquivo temporário
  4. Substitua o arquivo principal pelo arquivo temporário
  5. Remova o arquivo temporário

Isso pode funcionar para você (GNU sed):

sed ':a;$!N;1,4ba;P;$d;D' file

Isso removerá as últimas 12 linhas

sed -n -e :a -e '1,10!{P;N;D;};N;ba'

Isto irá remover as últimas 3 linhas do file :

for i in $(seq 1 3); do sed -i '$d' file; done;


Para excluir as últimas 4 linhas:

$ nl -b a file | sort -k1,1nr | sed '1, 4 d' | sort -k1,1n | sed 's/^ *[0-9]*\t//'   

Para truncar arquivos muito grandes realmente no local, temos o comando truncate . Não sabe sobre linhas, mas tail + wc pode converter linhas em bytes:

file=bigone.log
lines=3
truncate -s -$(tail -$lines $file | wc -c) $file

Há uma condição de corrida óbvia se o arquivo for gravado ao mesmo tempo. Neste caso, pode ser melhor usar head - it counts bytes desde o início do arquivo (mind disk IO), então sempre truncaremos o limite de linha (possivelmente mais linhas do que o esperado se o arquivo estiver escrito ativamente):

truncate -s $(head -n -$lines $file | wc -c) $file

Handy one-liner se você falhar na tentativa de login colocando a senha no lugar do nome de usuário:

truncate -s $(head -n -5 /var/log/secure | wc -c) /var/log/secure

Tente o seguinte comando:

n = line number
tail -r file_name | sed '1,nd' | tail -r

Uma solução divertida e simples de sed e tac :

n=4
tac file.txt | sed "1,$n{d}" | tac

NOTA

  • aspas duplas " são necessárias para o shell avaliar a variável $n no comando sed . sed simples, nenhuma interpolação será executada.
  • tac é um cat invertido, ver man 1 tac
  • o {} in sed está lá para separar $n & d (se não, o shell tenta interpolar variável não existente $nd )

Você pode obter a contagem total de linhas com wc -l <file> e usar

head -n <total lines - lines to remove> <file>


Você poderia usar a cabeça para isso.

Usar

$ head --lines=-N file > new_file

onde N é o número de linhas que você deseja remover do arquivo.

O conteúdo do arquivo original menos as últimas N linhas estão agora em new_file





sed