如何從偏移量處開始處理檔案?

如何從偏移量處開始處理檔案?

用例:您有一整週的多 GB 日誌文件,並且您需要使用例如grep.做出有根據的猜測,您假設從文件中間開始搜尋將使處理時間減少一半以上(因為它肯定不需要處理文件的整個其餘部分),同時不跳過任何相關資料。這可能嗎?

答案1

假設您的資料按時間順序排列:

  1. 透過查找到末尾並執行以下操作來獲取文件的大小ftell()
  2. 將結果除以 2;
  3. 用於fseek()尋找該位置;
  4. 透過呼叫一次來尋找下一行的開頭getline()
  5. 用於strptime()了解您目前的日期;
  6. 進行二分查找,重複步驟 4 和 5,直到找到所需的行。

答案2

您可以dd按照以下方式使用:

dd if=log skip=xK bs=1M

這將跳過 x * 1024 個大小為 1M (2^20) 的區塊。dd(1)有關單位處理的詳細信息,請參見參考資料。

如果您想自動進行二分搜索,假設您的日誌具有通常的格式,<date> [data]您可以將輸出通過管道傳輸到head -n 2,請檢查日誌開頭的日期第二線(在“通常”長線的合理假設下 - 將完成)並決定您想要哪一半。

答案3

取得檔案大小並除以 2。 (或 1024*1024 以獲得 MiB 等)

((fs = $(stat -c %s logfile) / 2 / 1024))

跳過並蒐索

dd if=logfile bs=1024 skip=$fs | grep blahblah

如果日誌檔案是,您可以進一步擴展這一點非常與 pr 的資料量一致。天透過加一個count=值到dd.

((cnt = $(stat -c %s logfile) / 5 / 1024))

dd if=logfile bs=1024 skip=$fs count=$cnt | grep blahblah

這將cnt * 1024在偏移位元組處傳輸資料位元組fs * 1024

將其全部包裝在一個腳本中,並在腳本外部執行管道連接到 grep、臨時檔案或您想要的任何內容。

答案4

目前還不清楚你到底想做什麼以及我的「過程」是什麼意思。對於大文件,我最喜歡的互動式程式是less.它可以毫無問題地處理大文件。它還可以跳到特定的百分比,例如使用30%。此外,您可以使用/和進行搜尋?

相關內容