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

phe*_*phe 6 linux bash shell awk sed

我有大日志文件的脚本.我可以检查所有行,并用tail和做一些事情awk.

尾巴:

tail -n +$startline $LOG
Run Code Online (Sandbox Code Playgroud)

AWK:

awk 'NR>='"$startline"' {print}' $LOG
Run Code Online (Sandbox Code Playgroud)

并检查时间,尾部工作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 ....
Run Code Online (Sandbox Code Playgroud)

但是当脚本运行时,检查所有行,何时看到$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
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 5

tail并且head是专门为此目的而创建的工具,因此直观的想法是针对它们进行了优化。在另一方面,awk并且sed可以完美地做到这一点,因为他们都像瑞士军刀,但是这不应该是其最好的“功力”在多个他人,他们有。

有效的方式使用awk,sed或其他方法从海量文件中打印行吗?方法上有一个很好的比较,并且head/ tail被认为是最好的方法。

因此,我会选择tail+ head


还请注意,如果不仅是最后一行,而是文本中的一组awk(在中或在中sed),您可以选择exit在所需的最后一行之后。这样,您可以避免脚本运行文件直到最后一行。

所以这:

awk '{if (NR>=10 && NR<20) print} NR==20 {print; exit}'
Run Code Online (Sandbox Code Playgroud)

比...快

awk 'NR>=10 && NR<=20'
Run Code Online (Sandbox Code Playgroud)

如果您输入的内容恰好包含20多行。


关于您的表情:

awk 'NR>='"$startline"' {print}' $LOG
Run Code Online (Sandbox Code Playgroud)

请注意,写起来更直接:

awk -v start="$startline" 'NR>=start' $LOG
Run Code Online (Sandbox Code Playgroud)

无需赘述,print因为它是隐式的。