Awk,tail,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 ,做一些事情。 由于文件太大,速度有点慢。

任何build议,它会更快?

脚本示例:

 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 

tailhead是特别为此目的而创建的工具,所以直观的想法是它们相当优化。 另一方面, awksed完全可以做到这一点,因为它们就像是一把瑞士军刀 ,但这不应该是它最好的“技能”,而不是其他的。

使用awk,sed或其他方法从大型文件打印行的高效方法? 有一个很好的比较方法和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因为它是隐含的。