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
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?
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.