Acho que todo mundo conhece os utilitários de linha cmd úteis do Linux head
e arquivos tail
. head
permite imprimir as primeiras X linhas de um arquivo, tail
faz o mesmo, mas imprime o final do arquivo. Qual é um bom comando para imprimir o meio de um arquivo? algo como middle --start 10000000 --count 20
(imprima a 10'000'000th até th 10'000'010th linhas).
Estou procurando algo que lide com arquivos grandes de forma eficiente. Eu tentei tail -n 10000000 | head 10
e é terrivelmente lento.
Você pode acelerar um pouco assim:
Nesses comandos, a opção
-n
fazsed
com que "suprima a impressão automática do espaço do padrão". Op
comando "imprimir[s] o espaço padrão atual" e oq
comando "sair imediatamente do script sed sem processar mais nenhuma entrada..." As aspas são dased
man
página .A propósito, seu comando
começa na décima milionésima linha do final do arquivo, enquanto seu comando "meio" parece começar na décima milionésima linha do início , o que seria equivalente a:
O problema é que, para arquivos não classificados com linhas de comprimento variável, qualquer processo terá que passar pelo arquivo contando novas linhas. Não há como encurtar isso.
Se, no entanto, o arquivo estiver classificado (um arquivo de log com carimbos de data/hora, por exemplo) ou tiver linhas de comprimento fixo, você poderá procurar no arquivo com base em uma posição de byte. No exemplo do arquivo de log, você pode fazer uma pesquisa binária por um intervalo de vezes como meu script Python aqui * faz. No caso do arquivo de tamanho fixo de registro, é muito fácil. Você apenas procura
linelength * linecount
caracteres no arquivo.* Eu continuo querendo postar mais uma atualização para esse script. Talvez eu dê um jeito nisso um dia desses.
Eu descobri o seguinte uso de
sed
Espero que seja útil para alguém!
Esta é minha primeira vez postando aqui! De qualquer forma, este é fácil. Digamos que você queira extrair a linha 8872 de seu arquivo chamado file.txt. Aqui está como você faz isso:
gato -n arquivo.txt | grep '^ *8872'
Agora a questão é encontrar 20 linhas depois disso. Para conseguir isso você faz
gato -n arquivo.txt | grep -A 20 '^ *8872'
Para linhas ao redor ou antes, veja os sinalizadores -B e -C no manual do grep.
A resposta sed de Dennis é o caminho a percorrer. Mas usando apenas head & tail, sob bash:
Isso varre as primeiras linhas de $ 1 + $ 2 duas vezes, então é muito pior do que a resposta de Dennis. Mas você não precisa se lembrar de todas aquelas letras sed para usá-lo....
Use o seguinte comando para obter o intervalo específico de linhas
Aqui debug.log é meu arquivo que consiste em uma falta de linhas e eu costumava imprimir as linhas do número da linha 1220974 para 1513793 em um arquivo test.log. espero que seja útil para capturar o intervalo de linhas.
Perl é rei:
Uma versão rubi oneliner.
Pode ser útil para alguém. As soluções com 'sed' fornecidas por Dennis e Dox são muito boas, até porque parecem mais rápidas.
Você pode usar 'nl'.
Por exemplo, este awk imprimirá linhas entre 20 e 40
Se você conhece os números das linhas, digamos que deseja obter as linhas 1, 3 e 5 de um arquivo, digamos /etc/passwd: