我有大日志文件的脚本。我可以检查所有行,并使用tail
和awk
执行某些操作。
尾:
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
答案 0 :(得分:5)
tail
和head
是专为此目的而创建的工具,因此直观的想法是它们已针对它进行了相当优化。另一方面,awk
和sed
可以完美地完成它,因为它们就像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
,因为它是隐含的。