「tail-100 | sed -n 1p」は一行だけ読みますか?

「tail-100 | sed -n 1p」は一行だけ読みますか?

ファイルの最後で逆さまに検索していますが、コードを表示すると説明が最も簡単になります。

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

おすすめ記事