ファイルの最後で逆さまに検索していますが、コードを表示すると説明が最も簡単になります。
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
(実際に末尾の行数が多すぎると早く終了するifがありましたが、単純化のためにこれを削除しました)
明らかに私は$linesのいくつかの作業を続けました。
私の質問は次の行についてです。
dateOfFirstLine=`tail -$numberOfLines $fileName | sed -n 1p | grep -Po "^[0-9]{2}/[0-9]{2}-[0-9]{2}:[0-9]{2}:[0-9]{2}"`
CPUとI / Oの観点から、これは1行しか読み取らないため、迅速かつ無視できますか?それとも実際にすべての行を読みますが、最初の行だけがパイプを通過しますか?私の考えでは、tailはまだすべての行を読むようです。そうですね。この場合、より良い方法がありますか?
関連メモでは、大容量ファイルの場合でもwc -lがなぜそんなに速いのですか?ファイル内のすべての文字を読み、改行の数を数えませんか?それがやっていることなら本当に速く見えます。ファイルシステムはそのような便利なデータを保持していますか?
答え1
一行しか読めませんかtail -100 | sed -n 1p
?いいえ、sedは100行を読みます。
ファイルの末尾から100行目を読むことが目標である場合は、次のいずれかを実行してください。
tail -100 | head -1
tail -100 | sed 1q
答え2
これらのtail
コマンドはいくつかのインテリジェンスを実装しています(私も聞いて経験しました)。tail
非常に大きなファイルでテストすると、ファイルの終わりに到達するのに時間がかかりません。あなたの場合は、$numberOfLines
最初のパイプを通してのみラインを配置し、2番目のパイプを通して1ラインだけを配置します。