在巨大的文件中遍历很长的行

时间:2018-06-26 14:04:44

标签: linux bash shell

我是Shell脚本的新手。我正在尝试使用Shell脚本在Linux环境中遍历日志文件。这是我的代码:

while read p; do
 head=${p:0:250}
 #some code here#
done < ./log.txt

我仅将前250个字符带入变量以在循环中对其进行处理。日志文件中的行可能很大,文件本身将近5 GB。当我在一些示例行上运行上述代码时,出现以下错误:

 xrealloc: cannot allocate 18446744071562068080 bytes (36864 bytes allocated)

有没有办法在迭代时只获得部分行而不是整个行?还是有其他更好的方法可以实现我的目标?

编辑: 当我使用-x运行脚本时,我看到脚本在read p处停了一段时间,然后收到错误消息。我认为它正在尝试在继续之前加载整个行,这导致了问题。

我正在将前250个字符分配给变量($head),以便稍后可以将该变量拆分为一个数组,并在对该数组进行迭代时进行一些操作。只要我可以从该行访问前250个字符,就不需要该变量。

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:3)

在进入shell循环之前,最好先将内容缩减至每行的前250个字符。您可以这样做,同时仍然通过process substitution保留循环中设置的变量的状态:

#!/usr/bin/env bash

while IFS= read -r p; do
  : put your code for processing "$p" here
done < <(cut -c -250 ./log.txt)

请参阅BashFAQ #1,讨论IFS=read -r的原因,以及BashFAQ #24,以了解此处为什么使用进程替换的更多详细信息。