Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何从文件到EOF的所有行?_Bash_Shell_Scripting_Sed_Sh - Fatal编程技术网

Bash 如何从文件到EOF的所有行?

Bash 如何从文件到EOF的所有行?,bash,shell,scripting,sed,sh,Bash,Shell,Scripting,Sed,Sh,我希望有人能帮我解决这个问题。我发现很多关于使用sed读取文件的话题,但没有一个适合我的情况。也许有人知道以下情况的解决方案: 我有一个记录器,可以创建一个定义大小的文件(在我的例子中是5MB)。记录器将该文件用作环形缓冲区,并将记录器信息写入该文件。当然,记录器从第1行开始,并用eof注释结尾。在十六进制编辑器中,它如下所示: 0d 3c 3c 3c 45 4f 46 3e 3e 3e 0d 20 20 20 20 20 .<<<EOF>>>. ->目标

我希望有人能帮我解决这个问题。我发现很多关于使用sed读取文件的话题,但没有一个适合我的情况。也许有人知道以下情况的解决方案:

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

0d 3c 3c 3c 45 4f 46 3e 3e 3e 0d 20 20 20 20 20  .<<<EOF>>>.
->目标:打印从第1行到EOF模式的所有内容,但两个文件的大小相同(在我的例子中为5MB)。看起来$p指的是真正的文件结尾,而不是EOF模式

sed -e '/EOF/,$d' test.log > result.txt 
->目标:打印EOF图案之前的所有内容,但result.txt的大小为0


有人能提供一些提示或解决方案来解决这个问题吗?

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


这是可行的,因为将5 MiB文件读入内存不会给具有千兆字节主内存的机器带来压力。如果文件本身是千兆字节的数据,你会三思而后行地将其存入内存,尽管扫描两次也会很痛苦。

用eof结尾是什么意思?如何将eof写入文件?你是指文字字符串“EOF”还是其他什么?为什么十六进制编辑器输出中的
中有空格?问题进行到一半时,您暗示该文件最初是用
0x20
字符填充的,如果这是真的,那么在开始时这样说会更有帮助。@JonathanWakely:该文件包含
作为标记。为什么,不要问。但是你的十六进制字节显示的是没有空格的
0d3c3c3c454f463e3e3e0d
,即
不是
询问如何使所有行都达到EOF也是令人困惑的,而
cat
就是这样做的,因为EOF意味着文件结束。你的意思是让所有的行符合一个特定的模式(在你的情况下,它恰好是
“EOF”
,但是可以是
“AAA”
,解决方案是一样的)@JonathanWakely:是的,没有空格是正确的。很抱歉
sed -e '/EOF/,$d' test.log > result.txt 
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
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