加入收藏 | 设为首页 | 会员中心 | 我要投稿 宜春站长网 (https://www.0795zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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

发布时间:2021-01-08 15:16:01 所属栏目:Linux 来源:网络整理
导读:我有大日志文件的脚本.我可以查看所有行,并使用tail和awk做一些事情. 尾巴: tail -n +$startline $LOG AWK: awk 'NR='"$startline"' {print}' $LOG 并检查时间,尾部工作6分39秒,awk工作6分42秒.所以两个命令做同样的事情/同一时间. 我不知道怎么做sed. Sed

我有大日志文件的脚本.我可以查看所有行,并使用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

解决方法

tail和head是专门为此目的而创建的工具,因此直观的想法是它们已经针对它进行了优化.另一方面,awk和sed可以完美地做到这一点,因为它们就像一个 Swiss Army knife,但这不应该是它最好的“技能”而不是它们拥有的其他多个.

在Efficient way to print lines from a massive file using awk,sed,or something else?有一个很好的比较方法和头/尾被视为最好的方法.

因此,我会去寻找尾巴.

另请注意,如果它不仅是最后一行,而是文本中的一组,在awk(或sed)中,您可以选择在所需的最后一行之后退出.这样,您可以避免脚本在最后一行之前运行该文件.

所以这:

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

没有必要说打印,因为它是隐含的.

(编辑:宜春站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读