cabeça; cabeça
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
Com o exposto, você pode especificar o primeiro número de linhas a serem removidas da cabeça da saída com o primeiro headcomando e o número de linhas a serem gravadas outfilecom o segundo. Ele também costuma fazer isso mais rápido do que sed- especialmente quando a entrada é grande - apesar de exigir duas invocações. Onde seddefinitivamente deve ser preferido, porém, é no caso em que <infileé não um regular, lseekable arquivo - porque isso irá normalmente não funcionar como o esperado nesse caso, mas sedpode lidar com todas as modificações de saída em um único processo, roteirizado.
Com um GNU, headvocê também pode usar a -forma negativa [num]no segundo comando. Nesse caso, o seguinte comando removerá a primeira e a última linha da entrada:
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
OU com um POSIX sed:
Digamos, por exemplo, eu estava lendo uma entrada de 20 linhas e queria retirar as 3 e as 7 primeiras. Se resolvesse fazer isso com / sed, faria com um buffer de cauda. Eu adicionaria primeiro três e sete para uma contagem total de dez e depois faria:
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
Esse é um exemplo que retira as 3 primeiras e as 7 últimas linhas da entrada. A idéia é que você pode armazenar em buffer quantas linhas desejar retirar da cauda da entrada no espaço do padrão em uma pilha, mas apenas Pcriar a primeira delas para cada linha puxada.
- Nas linhas
1,10 sed Pnão há nada porque, para cada uma delas, está empilhando a entrada no espaço do padrão linha por linha em um bloop de rancho.
- Na terceira linha, toda
seda pilha é deliminada - e, assim, as três primeiras linhas são retiradas da saída de uma só vez.
- Quando
sedatinge a $última linha de entrada e tenta puxar o Next, atinge o EOF e para o processamento completamente. Mas naquele tempo, o espaço do padrão contém todas as linhas 14,20- nenhuma das quais ainda foi Pcriada e nunca é.
- Em todas as outras linhas,
sed Papenas as linhas de ew ocorrem \nno espaço do padrão e as Dexclui antes de iniciar um novo ciclo com o que resta - ou as próximas 6 linhas de entrada. A sétima linha é anexada novamente à pilha com o Ncomando ext no novo ciclo.
E assim, da seqsaída de (que é 20 linhas numeradas seqüencialmente) , sedapenas imprime:
4
5
6
7
8
9
10
11
12
13
Isso se torna problemático quando o número de linhas que você deseja extrair da cauda da entrada é grande - porque sedo desempenho é diretamente proporcional ao tamanho do espaço do padrão. Ainda assim, porém, é uma solução viável em muitos casos - e o POSIX especifica um sedespaço padrão para lidar com pelo menos 4kb antes de ser eliminado.