如何將時間戳附加/附加到 grep 輸出?
我在家裡執行一個小型 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 秒$$ … $$我需要時間戳$$ … $$一個循環$$ … $$文件達到一定大小
您需要一個工具,它將主程序的日誌輸出作為其輸入,並將其寫入一個大小上限的日誌文件,並添加時間戳。存在執行此操作以及更多功能的工具。他們所做的“更多”是日誌文件的自動輪換,這也可以按需觸發,維護目前和舊日誌文件的大小上限日誌目錄。
您可以選擇以下工具:
- Dan Bernstein
multilog
來自 daemontools- Bruce Guenter
multilog
來自 daemontools-encores6-log
來自 s6的 Laurent Bercot- Gerrit Pape
svlogd
來自 runit- 韋恩·馬歇爾
tinylog
來自 perp- 我
cyclog
的諾什假設一個長時間執行的實用程序每隔幾秒列印一次所需的日誌輸出,例如:
#!/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
環境變數,您選擇的任意時區):
- Dan Bernstein
tai64nlocal
來自 daemontools- Bruce Guenter
tai64nlocal
來自 daemontools-encore- 我
tai64nlocal
的諾什觀看這樣的日誌,因為它們是用以下方式編寫的:
tail -F
,儘管tail
當旋轉速度非常快時存在已知問題。(這是 . 的幾個已知問題之一tail
。其他已知問題包括處理日誌文件的就地截斷,這些日誌文件很快就會出現更多日誌數據。這個問題可能由劣質系統觸發,例如logrotate
。幸運的是,上述工具不會截斷文件一旦完全寫入,就不會冒此類額外tail
問題的風險。)- 我
follow-log-directories
的來自 nosh,它“知道”這種日誌目錄並使用“游標”(在磁碟上永久維護)來可靠地跟踪日誌目錄中的位置,即使在日誌追隨者不查看時發生多次輪換也能繼續.其他類型的處理可以使用以下工具完成:
- 拉斯·奧爾伯里
multilog-watch
logrange
- 保羅·克雷默
multilog-stamptail
- 我
export-to-rsyslog
的諾什進一步閱讀
- 喬納森·德博因·波拉德 (2015)。“記錄”。daemontools 家族。經常給出答案。
- 布萊恩·坎特里爾 (2013)。 一次愉快的巡航如何變成了一場冒險。OmniIT Surge 2013。YouTube。
- 布萊恩·坎特里爾 (2012-07-29)。tail -f wrt 截斷 illumos-developers 的行為。
- https://unix.stackexchange.com/a/294206/5132
@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 輸出,而不是如何正確製作日誌。