emular cauda com sed

8

Eu tenho um mini-sistema com número limitado apenas de binários ( bash, cp, cat, sed, ...). Não tenho tailcomando e estou pensando se poderia emular a funcionalidade da cauda comsed

cat foo.txt | tail -n 10

Sei que posso imprimir as linhas 1 a 10 com o sed cat foo.txt | sed -n '1,10p', mas como imprimir as últimas 10 linhas?

Martin Vegter
fonte
2
Há muitos scripts sed úteis em uma linha de comando que você pode precisar: sed de uma linha
Slyx

Respostas:

15

Você poderia fazer algo assim:

sed -e :a -e '$q;N;11,$D;ba'
Chris Down
fonte
sed -e :a -e '$q;N;11,$D;ba' foopara coincidir com a pergunta.
Slyx
Não faço ideia de como funciona, mas funciona perfeitamente. Muito obrigado.
Martin Vegter 01/01
Alguém poderia explicar esse comando maravilhoso? Estou procurando ter um comando que mostre o início e o fim de um documento e acho que esse comando poderia ajudar, mas preciso adicionar a parte principal. De fato, o comando que eu estava procurando é simplesmente: sed -e '1,11p' -e :a -e '$q;N;11,$D;ba' Mas eu ainda gostaria de entender a parte da cauda !!!
Franck
0
tac foo |  sed -n '1,10p' | tac

mas se você não tiver tac, poderá usar apenas o sed desta maneira:

sed -n '1!G;h;$p' foo | sed -n '1,10p' | sed -n '1!G;h;$p'
Slyx
fonte
0

Está exprdisponível com o seu sistema? Em seguida, você pode tentar avaliar o número da linha desejada depois de contar o número total de linhas no arquivo.

Criei um arquivo chamado tmpcontendo os números de 1 a 20 em cada linha.

nlines=$(cat tmp | sed -n '$=')
cat tmp | sed -n $(expr $nlines - 9),"$nlines"p
11
12
13
14
15
16
17
18
19
20

Claro, você pode usar wc -l, se disponível.

O comando para calcular o número total de linhas no arquivo é obtido de sed one liners . No entanto, não verifiquei se ele também funciona com arquivos vazios.

PS Se exprnão estiver disponível, você pode usar subtrair números no Bash, como mostrado abaixo:

cat tmp | sed -n $((nlines-9)),"$nlines"p
Barun
fonte