我是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个字符,就不需要该变量。
任何帮助将不胜感激。谢谢。
答案 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,以了解此处为什么使用进程替换的更多详细信息。