0

この答えは明らかだと思いますが、頭をぶつけて頭痛がしていて、Search Fooが失敗しています…

この日付形式のログ ファイルがあります。

Sep  1 16:55:00 stuff happening 
Sep  1 16:55:01 THIS IS THE LINE YOU WANT at this time stamp
Sep  1 16:55:02 more stuff
Sep  1 16:55:02 THIS IS THE LINE YOU WANT at this time stamp
Sep  1 16:55:03 blah
Sep  1 16:55:04 blah and so on…..

私の最終的な目標は次のとおりです。

  1. 与えられた文字列を含むログ ファイルの最後の行を見つけます。たとえば、"THIS IS THE LINE..." これは後で計算する「魔法の時間」です。

  2. その行の日付を取得し、日付 + NN 秒の変数を設定します。将来の時間は通常、ステップ 1 の時間から 24 時間以内になるため、重要な場合は翌日にまたがる可能性があります。

  3. スクリプトのある時点で、システム クロックを新しい日付/時刻に進めます。その後、特定のイベントが発生するかどうかを確認します。

これが間違っていることはわかっていますが、これまでのところ、次の方法を見つけました。

  1. 私のイベントの最後の日付スタンプをつかみます.

    ログ日付=cat /logdir/my.log | grep "THIS IS THE LINE" | tail -1 | cut -f1,2,3 -d" "

リターン: 9 月 1 日 16:55:02

  1. 日付をより使いやすい形式に変換する

    logDate2="$(date -d "$logDate" +"%m-%d %H:%M:%S")"; エコー $logDate2

戻り値: 09-17 16:55:02

  1. 私はここで立ち往生しています - 私が欲しいのは:

    将来の日付=$logdate2 + XXXSeconds

誰かが時間の計算を手伝ってくれますか、それともこれをすべて行うためのより良い方法を指摘してくれますか?

ありがとう。

4

2 に答える 2

1
# Get time in seconds from the epoc (1970-01-01 00:00:00 UTC)

dateinseconds=$(date +"%s" -d "$(tail -1 logfile | grep "THIS IS THE LINE" | awk '{print $1, $2, $3}')")

# You can also use just awk without grep and tail to match and print the last line
dateinseconds=$(date +"%s" -d "$(awk '{/THIS IS THE LINE/}END{print $1, $2, $3}' logfile)")

gotofuture=$(( $dateinseconds + 2345 ))  # Add 2345 seconds
newdate=$(date -d "@${gotofuture}")
echo "$newdate"
于 2013-09-16T18:02:41.650 に答える
1
I'm stuck here - what I want is:
futuredate=$logdate2 + XXXSeconds

タイムスタンプを変換することでそれを行うことができます:

# convert log date to timestamp
logts="$(date -d "$logDate" '+%s')" 

# add timestamp with seconds
futurets=$(( logts + XXXSeconds ))

# get date based from timestamp, optionally you can add a format.
futuredate=$(date -d "@${futurets}")
于 2013-09-16T17:55:55.640 に答える