Bash

我可以通過管道將包含 JSON 的混合數據的“tail -f”傳送到 jq 以視覺化 JSON 嗎?

  • August 25, 2020

我玩了一段時間並重新研究,但我無法找到解決方案。我有一些巨大的日誌,有時也有巨大的 JSONS。但為了簡化想像如下:

mkdir logs
cd logs/
echo "$(date) [INFO] something" >> huge_log.log
echo "$(date) [INFO] something more" >> huge_log.log
echo "$(date) [INFO] Something with json: {\"foo\": \"bar\"}" >> huge_log.log
tail -n 5 -f huge_log.log | how_to_filter? | jq '.'

是否有可能看到這樣的東西(作為 jq ‘.’ 輸出的 json 將是):

Tue Aug 18 12:42:24 CEST 2020 [INFO] something
Tue Aug 18 12:42:29 CEST 2020 [INFO] something more
Tue Aug 18 12:43:05 CEST 2020 [INFO] Something with json: 
{
   "foo": "bar"
}

因此,不知何故,在列印日誌時自動檢測 json,並將它們顯示為輸出:

echo "{\"foo\": \"bar\"}" | jq '.'
{
 "foo": "bar"
}

以下內容適用於您的範例,對我來說似乎很合理。我正在遍曆日志文件中的每一行,如果一行與正則表達式“{.*}”匹配,則將其辨識為 json 對象,然後使用 jq 格式化。如果正則表達式不匹配,但它會正常​​列印。我對其進行了測試,它實際上也適用於更大更複雜的文件。

tail -n 15 huge_log.log | while read line ; do if echo $line | egrep "\{.*}" >/dev/null;json=$(echo $line | egrep -oh "\{.*}" | jq '.');then echo $line | awk -v json="$json" -F "\{.*}" '{printf "%s\n%s\n%s\n",$1,json,$2}'; fi;  done

引用自:https://serverfault.com/questions/1030569