日付切り捨て精度

日付切り捨て精度

私はいくつかの異なるシステムでビルドの進行状況をポーリングするbashスクリプトを使用しています。ビルドが完了したらstatログファイルを生成して最後の編集時間を見つけ、dateビルドが完了したときに人間が読める出力を生成するための時間を提供します。

これはいくつかの異なるシステムで実行されるため、出力は次のようになります。

sys00 finished around:        2015-06-11 01:42:29.484345955 -0700
sys01 finished around:        2015-06-11 01:21:17.560101447 -0700
sys02 finished around:        2015-06-11 03:51:56 -0700
sys03 finished around:        2015-06-11 04:32:12 -0700
sys04 finished around:        2015-06-11 01:40:47.977893386 -0700
sys05 finished around:        2015-06-11 01:16:12.158137851 -0700

私の最初の優先順位はそれらを同じように見せることでしたが、最初と最後の2つのシステムの追加の精度が必要ではなかったので、単に切り取りたいと思いました。私はこれをしようとしましたawk

echo $TIME | awk '[0-9]{9} {gsub('', '[0-9]{9}')}' -

しかし、ほとんど成功していませんでした。私はsedそれがより適切なツールであるかどうかを判断するのに十分な慣れていません。dateそうしないように指示できるかどうかはわかりません。date現在使用しているコマンドは次のとおりです。

COMMAND='date -r `stat -f "%m" '"$BASENAME"'/../logs/catTest*.log |& head -n1` +"%Y-%m-%d %H:%M:%S %z"'

$BASENAMEログファイルの検索に使用するデフォルトパスはどこにありますか?)

月経後に迷惑な数字を削除する方法は?

答え1

答えを得るには、sedそれを使用して小数点以下の桁数をフィルタリングできます。

sed 's/\.[0-9]\{1,\}//'

仕組み:

  • \.テキストと一致.
  • [0-9]\{1,\}1 つ以上の数字と一致

結果パターンは、「リテラル.と1つ以上の数字が続く一致」を意味し、それを何でも置き換えます。

答え2

あなたの質問を正しく理解したら。希望の出力は

out.txt

sys00 finished around: 2015-06-11 01:42:29 sys01 finished around: 2015-06-11 01:21:17 sys02 finished around: 2015-06-11 03:51:56 sys03 finished around: 2015-06-11 04:32:12 sys04 finished around: 2015-06-11 01:40:47 sys05 finished around: 2015-06-11 01:16:12

awkを使用したフィールド区切り記号

あっ-F。 '{print $1}' inputfile.txt | '{print $1}' awk -F- '{print $1, $2, $3}'

この出力が必要な場合 out2.txt

sys00 finished around: 2015 06 11 01:42:29 -0700 sys01 finished around: 2015 06 11 01:21:17 -0700 sys02 finished around: 2015 06 11 03:51:56 -0700 sys03 finished around: 2015 06 11 04:32:12 -0700 sys04 finished around: 2015 06 11 01:40:47 -0700 sys05 finished around: 2015 06 11 01:16:12 -0700

あっ-F。 '{印刷$1}' tst.txt | '{印刷 $1}' awk -F- '{印刷 $1, $2, $3, "-0700"}'

答え3

間違った情報を受け取ったと驚きましたstat -f "%m" ...。現在のバージョンのコマンドをコピーしましたか?

-f(ファイルシステム)の代わりに-c(フォーマット指定)を使用しているようです。 statに提供されたファイルのリストのマウントポイントを取得し、それを単一のパスに切り捨て、日付statマウントポイントとフォーマットを提供します。

スピードを上げたり簡素化するためにできることはたくさんありますが、その最初のものは日付を使用しないことです。

COMMAND='stat -fc "%y" '"$BASENAME"'/../logs/catTest*.log |& head -n1'

残念ながら、これはロケールによって異なり、ナノ秒を含むため、次のことができます。

COMMAND='LC_ALL=C stat -fc "%y" '"$BASENAME"'/../logs/catTest*.log |& head -n1|sed "s/\.[0-9]\+//"'

2番目のオプションは、日付のない通貨統計です。

COMMAND='date `stat -fc "@%Y" '"$BASENAME"'/../logs/catTest*.log |& head -n1` +"%Y-%m-%d %H:%M:%S %z"'

ナノ秒が表示され続ける場合(表示しないでください、バグレポートを送信してください)、より単純な正規表現を使用してフィルタリングできます。

COMMAND='date `stat -fc "@%Y" '"$BASENAME"'/../logs/catTest*.log |& head -n1` +"%Y-%m-%d %H:%M:%S %z"|sed "s/\.0\+//"'

ジョブを高速化する別の方法(すべてのログファイルを計算するか、別のジョブを作成する方が速いかによって異なります)は、statの前にファイルをフィルタリングすることです。

COMMAND='ls "$BASENAME"'/../logs/catTest*.log|head -n1|LC_ALL=C xargs stat -fc "%y" |sed "s/.[0-9]+//'

関連情報