emular cauda com sed

7

Eu tenho um mini-sistema com apenas um número limitado de binários ( bash , cp , cat , sed , ...). Eu não tenho o comando tail , e estou querendo saber se eu poderia emular a funcionalidade da cauda com sed

cat foo.txt | tail -n 10

Eu sei que posso imprimir as linhas 1-10 com sed cat foo.txt | sed -n '1,10p' , mas como eu imprimiria as últimas 10 linhas?

    
por Martin Vegter 01.01.2014 / 10:42

3 respostas

13

Você poderia fazer algo assim:

sed -e :a -e '$q;N;11,$D;ba'
    
por 01.01.2014 / 10:56
0
tac foo |  sed -n '1,10p' | tac

mas se você não tiver o tac, você pode usar somente sed dessa forma:

sed -n '1!G;h;$p' foo | sed -n '1,10p' | sed -n '1!G;h;$p'
    
por 01.01.2014 / 10:57
0

expr está disponível no seu sistema? Então você pode tentar avaliar o número da linha desejada depois de contar o número total de linhas no arquivo.

Eu criei um arquivo chamado tmp contendo 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 é retirado de sed one liners . No entanto, eu não verifiquei se funciona com arquivos vazios também.

P.S. Se expr não estiver disponível, você pode usar subtrair números no Bash conforme mostrado abaixo:

cat tmp | sed -n $((nlines-9)),"$nlines"p
    
por 01.01.2014 / 11:00

Tags