awk match命令和内存使用情况

时间:2017-06-07 07:58:17

标签: memory awk

我意识到我的awk脚本随着时间的推移越来越多地使用内存,当时我不打算将任何内容存储在内存中,所以我决定做一些测试。

这是一个非常简单的脚本(我的更大,但我在一个非常基本的问题上重现了这个问题)。我的awk脚本在bash脚本中使用,$file变量是awk运行的文件。

awk '       
{
    if(match($0,"word"))
    {          
        line=substr($0, RSTART - 20, RLENGTH + 20)
        print line
    }
}
' "$file"

如果我在一个大文件上执行此脚本,其中每行包含wordawk脚本的内存使用率会提高,如果我打印到文件,速度会更快。我必须在它冻结我的电脑之前停止它。你知道造成这种大内存使用的原因吗? 在我的真实脚本中,文件通常较小,并且match函数不会像这个函数那样触发每一行,但我宁愿确保不会发生任何错误。

编辑:这个问题在使用mawk时似乎没有出现,只有GNU awk,我不知道为什么。

2 个答案:

答案 0 :(得分:0)

尝试这种替代方案

awk '       
/word/ {
        # you can match here, if result of operation is needed for later action
        print "hello"
   }
' "$file"

匹配每一行诱导一些更多的计算,比如定义最长出现的索引(测试很多可能性),...所以是的,它是文件大小的指数(和内部的行大小)

如果匹配是一个无法与周围代码分开的条件部分,至少使用index()代替match()(或者更好if( $0 ~ /word/),如果不是其他结果,那么检查存在是目标)

答案 1 :(得分:0)

使用mawk时,似乎没有出现问题,只有GNU awk才会出现。

我在LC_ALL=C脚本之前使用awk来解决问题,如下所示:

LC_ALL=C awk '       
{
    if(match($0,"word"))
    {          
        line=substr($0, RSTART - 20, RLENGTH + 20)
        print line
    }
}
' "$file"

编辑:问题并没有出现在GNU awk 4.1.4上。这似乎只发生在旧版本(我的是3.1.3)