Será “tail -100 | sed -n 1p ”lê apenas uma linha?

0

Estou pesquisando ao final do arquivo, provavelmente é mais fácil explicar mostrando meu código:

enough=0
numberOfLines=100
fileName="/path/to.file"
# Tail the last $numberOfLines lines; if the line is within the time range we want them double how far we go back
while [ $enough -eq 0 ]; do
        # Get the date of the first line
        dateOfFirstLine='tail -$numberOfLines $fileName | sed -n 1p | grep -Po "^[0-9]{2}/[0-9]{2}-[0-9]{2}:[0-9]{2}:[0-9]{2}"'

        # See if it's still within the range we're interested in - if so then go back twice as far
        if [[ "$dateOfFirstLine" > "$startDate" ]] ; then
                numberOfLines=$((numberOfLines*2))
        elif [[ "$dateOfFirstLine" == "$startDate" ]] ; then
                numberOfLines=$((numberOfLines*2))
        else
                enough=1
                lines='tail -$numberOfLines $fileName'
        fi
done

(Eu realmente tenho um se lá sai cedo se o número de linhas que estamos seguindo ficar muito alto, mas eu cortei isso para simplificar)

Obviamente, eu continuo fazendo algum trabalho com $ lines.

Minha pergunta é sobre essa linha:

dateOfFirstLine='tail -$numberOfLines $fileName | sed -n 1p | grep -Po "^[0-9]{2}/[0-9]{2}-[0-9]{2}:[0-9]{2}:[0-9]{2}"'

isso será rápido e insignificante em termos de CPU e E / S, porque ele apenas lê uma linha ou lê todas as linhas, mas apenas a primeira será movida pelo pipe? Eu estou pensando cauda ainda lê cada linha, certo, caso em que existe uma maneira melhor de fazê-lo?

Em uma nota relacionada, como é o wc -l tão rápido, mesmo para arquivos grandes? Não está lendo todos os caracteres no arquivo e contando quantos caracteres de nova linha aparecem? Parece muito rápido se é isso que ele faz - o sistema de arquivos mantém dados assim úteis ou algo do tipo?

    
por mazz0 06.03.2015 / 18:43

2 respostas

2

tail -100 | sed -n 1p só lerá uma linha? Não, o sed irá ler 100 linhas.

Se o seu objetivo é ler a centésima linha do final do arquivo, faça um dos

tail -100 | head -1
tail -100 | sed 1q
    
por 06.03.2015 / 19:08
0

Os comandos tail têm alguma inteligência implementada (então eu ouvi e também experimentei); Se você testar tail em arquivos muito grandes, verá que não leva tempo para chegar à última parte do arquivo. No seu caso, você só passará $numberOfLines linhas pelo primeiro tubo e 1 linha pelo segundo tubo.

    
por 06.03.2015 / 19:01