“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线路穿过第一根管道,将一条线路穿过第二根管道。

相关内容