web-dev-qa-db-ja.com

タイムスタンプをgrep出力に追加/追加するにはどうすればよいですか?

自宅で小さなLinuxサーバーを実行していて、5秒ごとにCPUコアの温度をログに記録するスクリプトを書いていますが、それを使用するにはタイムスタンプが必要です。これまでのところ、sensorsコマンドの出力をファイルに保存するものと、日付と時刻を出力するコマンドがあります。 これら2つを組み合わせる方法を理解する必要があります。

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がどのように機能するかまったくわかりません。

4
wes1099

私が正しく理解している場合、達成したいことは、grepによって出力されるすべての行に現在の日付を付加することです。これは、bashスクリプトの簡単なタスクです。

sensors | grep ^Core |\
(
  DATE=$(date +%m/%d/%y-%H:%M:%S)
  while read LINE
  do
    echo "$DATE $LINE"
  done
) >> temps.log
0
DepressedDaniel

ログに記録するスクリプト[…] 5秒ごと[…]タイムスタンプが必要[…]ループ[…]ファイルが特定のサイズに達する

メインプログラムのログ出力を入力として受け取り、サイズ制限のあるログファイルに書き込み、タイムスタンプを追加するツールが必要です。これ以上のことを行うツールが存在します。彼らが行う「詳細」は、ログファイルの自動ローテーションであり、必要に応じてトリガーすることもでき、現在および古いサイズ制限のログディレクトリを維持します。ログファイル。

ツールには次の選択肢があります。

  • Dan Bernsteinの multilog daemontoolsから
  • Bruce Guenterの multilog daemontools-encoreから
  • ローランベルコット s6-log s6から
  • Gerrit Pape's svlogd runitから
  • ウェインマーシャルの tinylog perpから
  • cyclog noshから

次のような、数秒ごとに必要なログ出力を出力する長時間実行ユーティリティを想定します。

#!/ bin/sh 
#monitor-sensors 
 exec 2>&1 
 true 
 do 
センサー
スリープ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プログラムに移動し、これをリンクされたペアとして実行するのはほんの少しのステップです実際のデーモンの。

ただし、コマンドラインから1回限りの呼び出しを実行したいだけの場合は、既存のログディレクトリへの1回限りの出力をスピンアップすることもできます。

これらのツールのいくつかは、他の形式のタイムスタンプを実行できますが、すべてTAI64Nタイムスタンプを実行できます。 TAI64Nタイムスタンプは、ナノ秒の精度が可能になるように設計されていますが、前述の一部はこれを完全には実装していません。 TZデータベースがうるう秒を認識している限り、うるう秒などの問題にうまく対処できるように設計されています。 sortsort -m

次のようなツールを使用して、TAI64Nタイムスタンプから現在のタイムゾーンのローカルタイム(または、選択した任意のタイムゾーンであるTZ環境変数の場合)に変換します。

それらが書かれているようなログを見てください:

  • tail -F、ただし非常に高速なローテーションがある場合、tailには既知の問題があります。 (これは、tailに関するいくつかの既知の問題の1つです。他の既知の問題は、ログファイルのインプレーストランケーションの処理を含み、その後により多くのログデータが続きます。この問題は、logrotate。幸いなことに、前述のツールは、完全に書き込まれた後はファイルを切り捨てず、そのような追加のtail問題のリスクもありません。)
  • ぼくの - follow-log-directories from nosh。これは、この種のログディレクトリを「認識」し、「カーソル」(ディスク上に永続的に維持される)を使用して、ログディレクトリ内の位置を確実に追跡し、ログフォロワーが複数回ローテーションした場合でも継続するようにします。見ていません。

他の種類の処理は、次のようなツールで実行できます。

参考文献

9
JdeBP

@JdeBPはあなたがおそらくやるべきことをすでに答えています。しかし、それはあなたがした質問ではありませんでした。したがって、複数行の出力に物事を追加/追加する方法を知るためにGoogleからここに到着した人には、次のようになります。

まず、^Core*は、おそらくあなたが思っていることをしていません。これは、「Cor」で始まり、直後に任意の数の「e」が続く行に一致する正規表現です。「Cor」、「Core」、「Coreeeee」など。

第二に、xargsは、特にワンライナーやダーティクイックスクリプトに最適なツールです。 xargsを使用して、入力の各行を処理し、パラメーター-Iを使用して各行にコマンドを発行できます。したがって、次のようなことを簡単に行うことができます。

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

そこに'^Core*'を付けて引用符で囲みます。予期しない(非常にありそうもありませんが)シェル展開をしたくないからです。 {}-Iは、xargs{}を、実行するコマンドの引数の入力の各行で置き換えるように指示します。もちろん、別のパターンを選択することもできます。 find -execの構文を模倣したいだけです。 ${stamp}は、日付/時刻をstampに保存したことを前提としています。

サブシェルを発生させ、dateコマンドを実行し(必要な形式を指定)、xargsechoへの引数の一部としてその標準出力を使用させることもできます。

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

繰り返しますが、おそらくを実行することは、テスト済みの管理されたツールをログに使用することです。しかし、私はここで答えていますgrep出力にタイムスタンプを追加/追加する方法、適切にログを作成する方法ではありません。

6
giusti

私はおそらくそうするでしょう:

parallel --tagstring `date -Iseconds` 'sensors | grep' ::: ^Core

それは短く、人間が読める形式で、見事にソートされています。

0
Ole Tange