拖尾檔案並刪除日期時間

拖尾檔案並刪除日期時間

我有一個包含以下內容的日誌檔案。

2021-06-15T22:50:11+00:00 DEBUG {"slug": "something", "key2": "value2"}

我想要tail -f這個檔案並將結果通過管道傳遞給命令,但我需要在管道傳遞之前jq刪除部分,因為需要一個 JSON 字串。2021-06-15T22:50:11+00:00 DEBUGjqjq

有沒有辦法同時尾部日誌檔案並刪除日期時間部分?

最終,我想使用以下命令。

tail -f :file | jq

答案1

假設您可以存取sed能夠執行無緩衝輸出的 GNU:

tail -f file | sed -u 's/^[^{]*//' | jq .

這將tail -f在您的文件上運行並不斷將新數據發送到sed.該sed指令會將所有內容刪除到行中第一個之前的空格{,然後將結果傳送到jq

-uGNU 的選項使其sed不緩衝輸出。如果沒有此選項,sed將緩衝結果,並且僅在jq緩衝區(4 Kb?)已滿時才傳送資料。當工具的輸出不是終端本身時,像這樣進行緩衝是標準程序,並且這樣做是出於效率原因。在這種情況下,我們可能想要關閉緩衝,因此我們使用-u.

僅選擇DEBUGJSON 資料之前包含字串的行:

tail -f file | sed -u -e '/^[^{]*DEBUG /!d' -e 's///' | jq .

或者

tail -f file | sed -u -n 's/^[^{]*DEBUG //p' | jq .

這裡的命令sed將刪除所有不以不包含{字元的文字開頭、以 結尾的行DEBUG。如果找到這樣的行,則會刪除符合的文本,留下 JSON 資料。

請注意,我們在這裡基於字串DEBUG而不是{初始化 JSON 物件來提取 JSON。

與管道中的緩衝相關:

答案2

若要刪除前 2 個空格分隔的欄位:

tail -f file | stdbuf -oL cut -d ' ' -f3- | jq .

stdbuf -oL如 GNU 或 FreeBSD 系統上所見,cut進行基於行而不是基於區塊的輸出緩衝的技巧)。

相關內容