我正在从文件末尾向后搜索,通过显示我的代码可能最容易解释:
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
线路穿过第一根管道,将一条线路穿过第二根管道。