Como posso obter uma parte do arquivo de texto pelo terminal

7

Como posso obter um bloco de texto por linhas?

Eu tenho um arquivo de log com 6000000 linhas e quero apenas um bloco de 607366 a 700000.

Eu tentei algo como:

head -n 607366 | tail -700000 server.log > outputFile.txt
    
por Emanuella Ramos Cavalcante 11.10.2013 / 15:25

2 respostas

8

Você pode usar sed :

sed -n 607366,700000p server.log > outputFile.txt

Se você quiser usar head e tail , esse é o caminho certo:

head -n 700000 server.log | tail -n $(echo 700000-607366+1 | bc) > outputFile.txt

ou menor:

head -n 700000 server.log | tail -n 92635 > outputFile.txt
    
por Radu Rădeanu 11.10.2013 / 15:28
1

Otimizações sobre as de Radu:

sed '607366,$!d;700000q' server.log > outputFile.txt

Dessa forma, paramos de ler ( q ) server.log depois que encontramos a linha 700000 th .

head -n 700000 server.log | tail -n "$((700000-607366+1))"

Não há necessidade de invocar bc aqui, podemos usar a expansão aritmética padrão.

Mas fazer o contrário será muito mais eficiente:

tail -n +607366 | head -n "$((700000-607366+1))"

porque não envolve armazenar na memória um grande número de linhas.

    
por Stéphane Chazelas 11.10.2013 / 21:14