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 head
comando e o número de linhas a serem gravadas outfile
com 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 sed
definitivamente 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 sed
pode lidar com todas as modificações de saída em um único processo, roteirizado.
Com um GNU, head
você 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 P
criar a primeira delas para cada linha puxada.
- Nas linhas
1,10
sed
P
não há nada porque, para cada uma delas, está empilhando a entrada no espaço do padrão linha por linha em um b
loop de rancho.
- Na terceira linha, toda
sed
a pilha é d
eliminada - e, assim, as três primeiras linhas são retiradas da saída de uma só vez.
- Quando
sed
atinge a $
última linha de entrada e tenta puxar o N
ext, 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 P
criada e nunca é.
- Em todas as outras linhas,
sed
P
apenas as linhas de ew ocorrem \n
no espaço do padrão e as D
exclui 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 N
comando ext no novo ciclo.
E assim, da seq
saída de (que é 20 linhas numeradas seqüencialmente) , sed
apenas 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 sed
o 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 sed
espaço padrão para lidar com pelo menos 4kb antes de ser eliminado.