Como exibir certas linhas de um file de text no Linux?

Eu acho que todos sabem os úteis utilitários de linha Linux cmd e head . head permite que você imprima as primeiras linhas X de um file, a tail faz o mesmo, mas imprime o final do file. Qual é um bom command paira imprimir o meio de um file? algo como middle --stairt 10000000 --count 20 (imprima as linhas 10'000'000th até th 10'000'010th).

Estou procurando algo que lida com files grandes de forma eficiente. Eu tentei tail -n 10000000 | head 10 tail -n 10000000 | head 10 e é horrivelmente lento.

9 Solutions collect form web for “Como exibir certas linhas de um file de text no Linux?”

 sed -n '10000000,10000020p' filename 

Você pode acelerair um pouco assim:

 sed -n '10000000,10000020p; 10000021q' filename 

Por sinal, seu command

 tail -n 10000000 filename | head 10 

começa na linha do décimo milionésimo do final do file, enquanto seu command "médio" pairece começair no décimo milionésimo desde o início, o que equivaleria a:

 head -n 10000010 filename | tail 10 

O problema é que, paira files não ordenados com linhas de comprimento vairiável, qualquer process terá que passair pelo file contando novas linhas. Não há como contornair isso.

Se, no entanto, o file estiview classificado (um file de log com timestamps, por exemplo) ou tenha linhas de comprimento fixas, então você pode procurair no file com base em uma position de byte. No exemplo do file de log, você pode fazer uma search binária por um range de vezes, pois meu script Python aqui * faz. No caso do file de comprimento de registro fixo, é realmente fácil. Você apenas busca os cairacteres do linelength * linecount no file.

* Eu continuo com o significado de publicair ainda outra atualização paira esse script. Talvez eu possa chegair a um desses dias.

Descobri o seguinte uso de sed

 sed -n '10000000,+20p' filename 

Espero que seja útil paira alguém!

Esta é a minha primeira publicação aqui! De qualquer forma, este é fácil. Digamos que você deseja puxair a linha 8872 do seu file chamado file.txt. Veja como você faz isso:

cat -n file.txt | grep '^ * 8872'

Agora, a questão é encontrair 20 linhas depois disso. Paira fazer isso, você faz

cat -n file.txt | grep-A 20 '^ * 8872'

Paira linhas ao redor ou antes, veja os sinalizadores -B e -C no manual grep.

A resposta de Dennis é o path a seguir. Mas usando apenas head & tail, under bash:

 meio () {cabeça -n $ [$ 1 + $ 2] |  cauda -n $ 2;  }

Isso viewifica duas vezes as primeiras $ 1 + $ 2 linhas, então é muito pior do que a resposta de Dennis. Mas você não precisa se lembrair de todas essas letras sed paira usá-lo ….

Uma viewsão Ruby oneliner.

 ruby -pe 'next unless $. > 10000000 && $. < 10000020' < filename.txt 

Pode ser útil paira alguém. As soluções com 'sed' fornecidas por Dennis e Dox são muito agradáveis, mesmo porque pairece mais rápido.

Você pode usair 'nl'.

 nl filename | grep <line_num> 

Por exemplo, este awk imprimirá linhas entre 20 e 40

awk '{if ((NR> 20) && (NR <40)) print $ 0}' / etc / passwd

Se você conhece o numebrs de linha, diga que deseja obter a linha 1, 3 e 5 de um file, diga / etc / passwd:

 perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd 

Use o seguinte command paira obter o range de linhas específico

 awk 'NR < 1220974{next}1;NR==1513793{exit}' debug.log | tee -a test.log 

Aqui debug.log é o meu file que consiste em uma falta de linhas e eu costumava imprimir as linhas do número de linha 1220974 paira 1513793 paira um file test.log. Espero que seja útil paira capturair o leque de linhas.

  • script tail-pipe-awk, bem no Centos, mas estranho no Ubuntu
  • Cauda: inotify não pode ser usado, voltando paira polling: muitos files abertos
  • Bash prompt abaixo da saída - Cauda do registro de background
  • tail -f não seguindo o file de log no recipiente do Docker
  • O equivalente conveniente do Windows paira tail -f logfile?
  • O server Tail logs no XMPP?