Pergunta

Eu tenho um tempo muito longo arquivo que eu quero imprimir, mas ignorando os primeiros 1E6 linhas, por exemplo. Eu olho para a página de homem gato, mas eu não vi nenhuma opção para fazer isso. Eu estou procurando um comando para fazer isso ou um programa do bash simples.

Foi útil?

Solução

Você vai precisar de cauda. Alguns exemplos:

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >

Se você realmente precisa para saltar um determinado número de "primeiros" linhas, o uso

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >

Isto é, se você quiser pular N linhas, você começar a imprimir linha N + 1. Exemplo:

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >

Se você quiser apenas ver os últimos tantas linhas, omitir o "+":

$ tail -n <N> <filename>
< last N lines of file. >

Outras dicas

Se você tem cauda GNU disponível em seu sistema, você pode fazer o seguinte:

tail -n +1000001 huge-file.log

É o personagem + que faz o que quiser. Para citar a página do manual:

Se o primeiro caracter de K (o número de bytes ou linhas) é um `+', Imprimir começando com o item Kth desde o início de cada arquivo.

Assim, como observado no comentário, colocando +1000001 início da impressão com o primeiro item após as primeiras 1.000.000 linhas.

A maneira mais fácil que eu encontrei para remover as primeiras linhas dez de um arquivo:

$ sed 1,10d file.txt

A menos detalhada versão com AWK:

awk 'NR > 1e6' myfile.txt

Mas eu recomendo usar números inteiros.

Apenas para propor uma alternativa sed. :) Para pular primeiro um milhão de linhas, tente |sed '1,1000000d'.

Exemplo:

$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005

Se você quiser pular primeiro duas linhas
tail -n +3 <filename>

Se você quiser pular primeira x linha
tail -n +$((x+1)) <filename>

Se você quiser ver em primeira linha 10 você pode usar sed como abaixo:

sed -n '1,10 p' myFile.txt

ou se você quiser ver as linhas de 20 a 30 você pode usar:

sed -n '20,30 p' myFile.txt

Use a sed delete comando com um endereço gama . Por exemplo:

$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.

Como alternativa, se você quiser apenas para imprimir uma conhecida gama usar o comando de impressão com a bandeira -n:

$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt

Esta solução deve funcionar de forma confiável em todos os sistemas UNIX, independentemente da presença de utilitários GNU.

Este script shell funciona bem para mim:

#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
    if (NR >= initial_line && NR <= end_line) 
    print $0
}' $3

Usado com esse arquivo de exemplo (file.txt):

one
two
three
four
five
six

O comando (ele irá extrair da segunda para a quarta linha no arquivo):

edu@debian5:~$./script.sh 2 4 file.txt

O resultado deste comando:

two
three
four

Claro, você pode melhorá-lo, por exemplo, por meio de testes que todos os valores dos argumentos são o esperado: -)

Você pode fazer isso usando os comandos de cabeça e cauda:

head -n <num> | tail -n <lines to print>

, onde num é 1E6 + o número de linhas que você deseja imprimir.

sed -n '1d;p'

Este comando irá apagar a primeira linha e imprimir o resto

cat < File > | awk '{if(NR > 6) print $0}'

eu precisava para fazer o mesmo e encontrei esta discussão.

Eu tentei "tail -n +, mas tudo apenas impresso.

As linhas mais + funcionou muito bem no prompt, mas acabou por se comportou totalmente diferente quando executado no modo sem cabeça (cronjob).

Eu finalmente escreveu isso mesmo:

skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top