
我有一個包含以下內容的日誌檔案。
2021-06-15T22:50:11+00:00 DEBUG {"slug": "something", "key2": "value2"}
我想要tail -f
這個檔案並將結果通過管道傳遞給命令,但我需要在管道傳遞之前jq
刪除部分,因為需要一個 JSON 字串。2021-06-15T22:50:11+00:00 DEBUG
jq
jq
有沒有辦法同時尾部日誌檔案並刪除日期時間部分?
最終,我想使用以下命令。
tail -f :file | jq
答案1
假設您可以存取sed
能夠執行無緩衝輸出的 GNU:
tail -f file | sed -u 's/^[^{]*//' | jq .
這將tail -f
在您的文件上運行並不斷將新數據發送到sed
.該sed
指令會將所有內容刪除到行中第一個之前的空格{
,然後將結果傳送到jq
。
-u
GNU 的選項使其sed
不緩衝輸出。如果沒有此選項,sed
將緩衝結果,並且僅在jq
緩衝區(4 Kb?)已滿時才傳送資料。當工具的輸出不是終端本身時,像這樣進行緩衝是標準程序,並且這樣做是出於效率原因。在這種情況下,我們可能想要關閉緩衝,因此我們使用-u
.
僅選擇DEBUG
JSON 資料之前包含字串的行:
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
進行基於行而不是基於區塊的輸出緩衝的技巧)。