用例:您有一整週的多 GB 日誌文件,並且您需要使用例如grep
.做出有根據的猜測,您假設從文件中間開始搜尋將使處理時間減少一半以上(因為它肯定不需要處理文件的整個其餘部分),同時不跳過任何相關資料。這可能嗎?
答案1
假設您的資料按時間順序排列:
- 透過查找到末尾並執行以下操作來獲取文件的大小
ftell()
; - 將結果除以 2;
- 用於
fseek()
尋找該位置; - 透過呼叫一次來尋找下一行的開頭
getline()
; - 用於
strptime()
了解您目前的日期; - 進行二分查找,重複步驟 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%
。此外,您可以使用/
和進行搜尋?
。