簡體   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