Grep

如何將時間戳附加/附加到 grep 輸出?

  • September 26, 2021

我在家裡執行一個小型 linux 伺服器,我正在編寫一個腳本來每 5 秒記錄一次 CPU 核心的溫度,但我需要時間戳才能使它有用。到目前為止,我有一些東西可以將sensors命令的輸出保存到一個文件中,並且我有一個列印日期和時間的命令。我只需要弄清楚如何將這兩者結合起來。

sensors | grep ^Core* >> temps.log將 temps.log 中的 temps 保存為以下格式:

Core 0:       +39.0°C  (high = +76.0°C, crit = +100.0°C)
Core 1:       +40.0°C  (high = +76.0°C, crit = +100.0°C)

在我能做的日期date +%m/%d/%y-%H:%M:%S返回

mm/dd/yy-hh:mm:ss

我四處搜尋,看到有人建議使用,gawk但我完全不知道它是如何gawk工作的。

要記錄的腳本

$$ … $$每 5 秒$$ … $$我需要時間戳$$ … $$一個循環$$ … $$文件達到一定大小

您需要一個工具,它將主程序的日誌輸出作為其輸入,並將其寫入一個大小上限的日誌文件,並添加時間戳。存在執行此操作以及更多功能的工具。他們所做的“更多”是日誌文件的自動輪換,這也可以按需觸發,維護目前和舊日誌文件的大小上限日誌目錄

您可以選擇以下工具:

假設一個長時間執行的實用程序每隔幾秒列印一次所需的日誌輸出,例如:

#!/bin/sh
# 監控感測器
執行 2>&1
雖然是真的
做
感測器
睡覺 5
完成 | grep --line-buffered -- '^Core'

用法很簡單:

  • monitor-sensors | cyclog ./temps
  • monitor-sensors | multilog t ./temps

並且可以很容易地調整:

  • monitor-sensors | cyclog --max-file-size 32768 --max-total-size 1048576 ./temps
  • monitor-sensors | s6-log t s32768 S1048576 ./temps
  • monitor-sensors | multilog t s32768 n5 ./temps

從這裡開始,使用 daemontools-encore/runit/perp/s6/nosh 之類的工具集,只需一小步即可將此管道的左側和右側移動到run程序中,並將其作為一對連結的實際守護程序執行。

但是,如果您只想(比如說)從命令行執行一次性呼叫,它們也都可以處理為一次性輸出到現有日誌目錄的處理。

其中一些工具可以做其他形式的時間戳,但它們都可以做 TAI64N 時間戳。TAI64N 時間戳被設計為能夠達到納秒級精度,儘管前面提到的一些時間戳並沒有完全實現這一點;只要您的 TZ 數據庫知道它們,它們就可以非常愉快地處理諸如閏秒之類的事情;並且是微不足道的sort,甚至sort -m

使用以下工具將 TAI64N 時間戳轉換為您目前時區的本地時間(或者,鑑於它只是TZ環境變數,您選擇的任意時區):

觀看這樣的日誌,因為它們是用以下方式編寫的:

  • tail -F,儘管tail當旋轉速度非常快時存在已知問題。(這是 . 的幾個已知問題之一tail。其他已知問題包括處理日誌文件的就地截斷,這些日誌文件很快就會出現更多日誌數據。這個問題可能由劣質系統觸發,例如logrotate。幸運的是,上述工具不會截斷文件一旦完全寫入,就不會冒此類額外tail問題的風險。)
  • follow-log-directories的來自 nosh,它“知道”這種日誌目錄並使用“游標”(在磁碟上永久維護)來可靠地跟踪日誌目錄中的位置,即使在日誌追隨者不查看時發生多次輪換也能繼續.

其他類型的處理可以使用以下工具完成:

進一步閱讀

@JdeBP 已經回答了您可能應該做的事情。但這不是你提出的問題。因此,對於任何從 Google 來到這裡並想知道如何將內容附加/添加到多行輸出的人來說,這裡是:

首先,^Core*可能沒有做你認為它做的事情。它是一個正則表達式,用於匹配以“Cor”開頭的行緊跟任意數量的“e”:“Cor”、“Core”、“Coreeeee”等。

其次,xargs它是一個很棒的工具,特別是對於單行和快速腳本。您可能必須xargs對每一行輸入採取行動,並使用參數為每一行發出一個命令-I。所以你可以很容易地做這樣的事情:

sensors | grep '^Core*' | xargs -I{} echo "${stamp}: {}" >> temps.log

加上'^Core*'引號,因為您不希望在那裡出現意外(儘管極不可能)的外殼擴展。{}in-I告訴用它將執行的命令的參數中的每一行輸入替換xargs{}當然,您可以選擇其他模式;我只是喜歡模仿find -exec. 假設您將${stamp}日期/時間保存在stamp.

您還可以引發一個子shell,在其中執行date命令(指定您想要的任何格式)並將xargs其標準輸出用作您的參數的一部分echo

sensors | grep '^Core*' | xargs -I{} echo "$(date): {}" >> temps.log

同樣,您可能應該做的是使用經過測試和維護的工具進行日誌記錄。但我在這裡回答如何將時間戳附加/附加到 grep 輸出,而不是如何正確製作日誌。

引用自:https://unix.stackexchange.com/questions/326127