【问题标题】:Troubleshooting 'grep: line too long'疑难解答“grep:行太长”
【发布时间】:2015-08-03 11:21:46
【问题描述】:

我有一个文件,其中必须包含一个或多个“太长”行:当我 grep 它时,我得到了

grep: line too long

a number of posts on this site 推荐替代方案,但没有一个对我有用。我有什么方法可以识别和消除文件中的长行,或者有什么策略可以将文件分成较小的文件以尝试隔离过长的行?

这是我根据其他帖子尝试过的命令示例:

$ cat myFile | grep -no 'myText' > out.txt
$ grep 'myText' myFile > out.txt

该文件的大小为 3367005608,这可能仅与我最初尝试使用 zgrep 时相关,但遇到了同样的问题。我收到以下错误

awk:命令。 line:1: (FILENAME=myFile FNR=1) fatal: set_record: databuf: can't allocate 2147483648 bytes of memory (Cannot allocate memory)

当使用awk

awk '/myText/' myFile > out.txt

【问题讨论】:

  • 我不知道它会更好 - 它可能有类似的行长度限制 - 但您可以尝试 awk '/myText/' myFile 作为 grep 的替代品...另外,用于故障排除目的:awk 'length() > 1000 { print NR, length(); } 将为您提供超过指定阈值的任何行的行号和长度...
  • @twalberg 我已经更新了我的问题——awk 似乎也有行或文件大小的问题。
  • 我猜你的文件不包含换行符,所以 awk 和 grep 都不能一次工作一行,而是必须尝试将整个文件读入内存。文件中是否还有其他字符可以被 awk 用来将其分隔为“记录”?
  • @EdMorton 该文件是一个gunzipped gz 日志文件,应该是人类可读的(只是很大)。当tailing 它看起来不错,但是当lessing 它时,我会提示"myFile" may be a binary file. See it anyway?。我可以打开它,但顶部都是^@^@^@^@^@^@^@^@^s。底部没问题。因此,这似乎是由于文件损坏造成的。我之前使用过tail,所以没有意识到发生了损坏。
  • 我的计划是拆分文件并开始消除损坏的部分。不过遇到split: xae: No space left on device,所以我得看看如何获​​得更多空间。

标签: awk grep


【解决方案1】:

尝试先从文件中删除所有空字节:

tr -d '\000' < fileWithNulls > noNulls

然后尝试使用 noNulls 文件运行 grep 或 awk。

【讨论】:

  • 由于我的文件太大,我被取消了共享,但是当我尝试您的解决方案时出现内存错误。我正在努力争取更多空间,然后试一试。
  • 谢谢@anubhava——一旦我获得了足够的空间并查看了tr 的手册页并意识到&lt;&gt; 很重要,不仅仅是用来表示样板:)
  • 不客气,我很久以前就用它从这些空字节中提取我的日志文件。
【解决方案2】:

如果是二进制文件,空字节\0 的出现通常比换行符\n 的出现更常见。所以你可以打破空字节

grep -z 'myText' myFile

或者可能是所有控制字符

tr '[:cntrl:]' '\n' < myFile | grep myText

【讨论】:

  • 谢谢@StevenPenny。离开上面@EdMorton 的探测,我发现该文件似乎已损坏。您的建议和tr '[:cntrl:]' '\0' &lt; myFile | grep myText 都会导致grep: line too long 消息。
猜你喜欢
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2014-08-29
  • 2011-10-27
  • 1970-01-01
相关资源
最近更新 更多