繁体   English   中英

如何将所有行从文件传送到EOF?

[英]How to get all lines from a file to EOF?

我希望有人可以帮助我解决问题。 我发现了很多有关使用sed读取文件的主题,但是没有什么适合我的情况的。 也许有人知道以下情况的解决方案:

我有一个记录器,它创建一个定义大小的文件(在我的情况下为5MB)。 记录器将文件用作环形缓冲区,并将记录器信息写入此文件。 记录器当然从第1行开始,并以eof标记结尾。 在十六进制编辑器中,如下所示:

0d 3c 3c 3c 45 4f 46 3e 3e 3e 0d 20 20 20 20 20  .<<<EOF>>>.

现在我有两种情况,一种是简单的,一种是复杂的:

  1. 我需要从头到尾打印标识符。

  2. 最漂亮的解决方案是识别EOF之后是否为初始值(0x20),然后从第1行打印到EOF。 如果在行尾标识符之后有值,则在EOF之后读取所有内容,直到文件大小,然后从第一行到EOF标识符。 这应该打印出该“环形缓冲区”的所有行。 这样的事情可能吗?

解决(1)我尝试了一些sed命令,例如:

sed -e '1,$p' test.log > result.txt 

->目的:打印从第一行到EOF模式的所有内容,但是两个文件的大小相同(在我的情况下为5MB)。 看起来$ p指向文件的实际结尾而不是EOF模式。

sed -e '/EOF/,$d' test.log > result.txt 

->目的:在EOF模式之前打印所有内容,但result.txt的大小为0。

有人可以提供任何提示或解决方案来解决此问题吗?

使用sed ,我认为您需要两个命令(以及文件的两次扫描):

logfile="…some-name…"
eofmark="<<<EOF>>>"

sed -n "/$eofmark/,\$ { /$eofmark/d; p; }" $logfile  # Read the tail material
sed -n "1,/$eofmark/  { /$eofmark/d; p; }" $logfile  # Read the head material

使用perlawk ,您可以将整个文件插入到内存中,然后打印尾部,然后打印头部。 例如,在awk

logfile="…some-name…"
eofmark="<<<EOF>>>"

awk "/$eofmark/"' {eofline = NR}
     {line[NR] = $0}
     END { for (i = eofline+1; i <= NR; i++) print line[i]
           for (i = 1; i < eofline; i++) print line[i]
     }' $logfile

这是可行的,因为将5 MiB文件读入内存不会对具有千兆字节主内存的计算机造成压力。 如果文件本身是千兆字节的数据,则将文件保存到内存时您会三思而后行,尽管扫描两次也会很痛苦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM