Awk 故障排除';grep:行太长';

Awk 故障排除';grep:行太长';,awk,grep,Awk,Grep,我有一个文件,其中必须有一行或多行“太长”:当我grepit时,我得到了它 grep: line too long 有一些推荐的替代方案,但没有一个对我有效。是否有某种方法可以识别并消除文件中的长行,或者有一种策略可以将文件拆分为较小的文件,以尝试隔离过长的行 以下是我根据其他帖子尝试过的命令示例: $ cat myFile | grep -no 'myText' > out.txt $ grep 'myText' myFile > out.txt 该文件的大小为33670056

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

grep: line too long
有一些推荐的替代方案,但没有一个对我有效。是否有某种方法可以识别并消除文件中的长行,或者有一种策略可以将文件拆分为较小的文件,以尝试隔离过长的行

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

$ cat myFile | grep -no 'myText' > out.txt
$ grep 'myText' myFile > out.txt
该文件的大小为3367005608,这可能只与我最初尝试使用
zgrep
有关,但遇到了相同的问题。我得到以下错误

awk: cmd. line:1: (FILENAME=myFile FNR=1) fatal: set_record: databuf: can't allocate 2147483648 bytes of memory (Cannot allocate memory)
如果是二进制文件,则出现空字节
\0
通常比出现换行
\n
更常见。所以你可以用空字节来代替

grep -z 'myText' myFile
或者可能是所有的控制字符

tr '[:cntrl:]' '\n' < myFile | grep myText
tr'[:cntrl:]['\n'
首先尝试从文件中删除所有空字节:

tr -d '\000' < fileWithNulls > noNulls
tr-d'\000'noNulls

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

我不知道这会更好-它可能有类似的行长度限制-但您可以尝试
awk'/myText/'myFile
作为
grep
的替代方案。。。此外,出于故障排除目的:
awk'length()>1000{print NR,length();}
将为指定阈值上的任何行提供行号和长度…@twalberg我已更新了我的问题--
awk
似乎与行或文件大小有关,也是。我猜你的文件没有换行符,所以awk和grep都不能一次处理一行,而是必须尝试将整个文件读入内存。文件中是否有其他字符可供awk用于将其划分为“记录”@EdMorton该文件是一个
gunzip
ped
gz
日志文件,应该是人类可读的(只是很大)。当
tail
ing它看起来很好,但当
less
ing它时,我会被提示
“myFile”可能是一个二进制文件。看到了吗?
。我可以打开它,但顶部是所有的
^@^^@^^@^^@^@^ ^
s。底部没问题。因此,这似乎是由于文件损坏。我以前使用过tail,所以没有意识到已经发生了损坏。我的计划是分割文件并开始消除损坏的部分。但是,遇到了
split:xae:设备上没有剩余空间,所以我必须考虑获得更多空间。谢谢@stevenny。在上面@EdMorton的探测中,我发现该文件似乎已损坏。您的建议和
tr'[:cntrl:'''\0'
都会导致
grep:line太长
消息。由于我的文件太大,我被取消了共享,但在尝试您的解决方案时出现内存错误。我正在努力争取更多的空间,然后会尝试一下。谢谢@anubhava——这就像一个冠军,因为我获得了足够的空间,并查看了
tr
的手册页,意识到
非常重要,不仅仅是用来表示样板:)非常欢迎,我用了很长一段时间才将日志文件从这些空字节中删除。
tr -d '\000' < fileWithNulls > noNulls