awk,tail,sed或其他 - 对于大文件哪一个更快?

时间:2014-11-21 08:43:03

标签: linux bash shell awk sed

我有大日志文件的脚本。我可以检查所有行,并使用tailawk执行某些操作。

尾:

tail -n +$startline $LOG

awk中:

awk 'NR>='"$startline"' {print}' $LOG

检查时间,尾部工作6分39秒,awk工作6分42秒。所以两个命令做同样的事情/同一时间。

我不知道如何处理sed。 Sed可以比tail和awk更快吗?或者也许是其他命令。


第二个问题,我使用$startline并且每次继续从最后一行继续。例如:

我使用脚本行:

10:00AM -> ./script -> $startline=1 and do something -> write line number to save file(for ex. 25),
10:05AM -> ./script -> $startline=26(read save file +1) and do something -> write line number save file(55),
10:10AM -> ./script -> $startline=56(read save file +1) and do something ....

但是当脚本运行时,检查所有行以及何时查看$startline,执行某些操作。由于文件庞大,它有点慢。

对它的任何建议都会更快?

脚本示例:

lastline=$(tail -1 "line.save")
startline=$(($lastline + 1))
tail -n +$startline $LOG | while read -r
do
....
done
linecount=$(wc -l "$LOG" | awk '{print $1}')
echo $linecount >> line.save

1 个答案:

答案 0 :(得分:5)

tailhead是专为此目的而创建的工具,因此直观的想法是它们已针对它进行了相当优化。另一方面,awksed可以完美地完成它,因为它们就像Swiss Army knife,但这不应该是最好的"技能"超过他们拥有的其他多个人。

Efficient way to print lines from a massive file using awk, sed, or something else?中,对方法进行了很好的比较,head / tail被视为最佳方法。

因此,我会选择tail + head


另请注意,如果不仅是最后一行,而是文本中的一组,awk(或sed),您可以选择exit你想要的最后一行。这样,您可以避免脚本在最后一行之前运行该文件。

所以这个:

awk '{if (NR>=10 && NR<20) print} NR==20 {print; exit}'

awk 'NR>=10 && NR<=20'

如果您的输入恰好包含超过20行。


关于你的表达:

awk 'NR>='"$startline"' {print}' $LOG

请注意,写作更直接:

awk -v start="$startline" 'NR>=start' $LOG

没有必要说print,因为它是隐含的。