"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 측면에서 이는 하나의 행만 읽기 때문에 빠르고 무시할 수 있습니까? 아니면 실제로 모든 행을 읽지만 첫 번째 행만 파이프를 통해 이동합니까? 제 생각에는 tail이 여전히 모든 줄을 읽을 것 같습니다. 그렇죠. 이 경우 더 좋은 방법이 있을까요?

관련 메모에서 대용량 파일의 경우에도 wc -l이 왜 그렇게 빠른가요? 파일의 모든 문자를 읽고 개행 횟수를 계산하지 않습니까? 그것이 하고 있는 일이라면 정말 빨라 보입니다. 파일 시스템이 그렇게 편리한 데이터를 보유하고 있습니까?

답변1

한 줄만 읽을 수 있나요 tail -100 | sed -n 1p? 아니요, sed는 100줄을 읽습니다.

파일 끝에서 100번째 줄을 읽는 것이 목표라면 다음 중 하나를 수행하세요.

tail -100 | head -1
tail -100 | sed 1q

답변2

이러한 tail명령은 일부 지능을 구현합니다(저도 들어봤고 경험했습니다). tail매우 큰 파일에서 테스트하면 파일 끝에 도달하는 데 시간이 걸리지 않습니다. 귀하의 경우에는 $numberOfLines첫 번째 파이프를 통해서만 선을 배치하고 두 번째 파이프를 통해서는 한 선만 배치합니다 .

관련 정보