2017-05-12 6 views
0

タイムスタンプを含むログファイルがあります。私にとって幸いタイムスタンプ境界を持つログファイルのSed抽出セクション

FWIW形式はYYYY-MM-DD HH:MM:SS.sss(ノーさらにすなわちミリ秒粒度はなく)である

私は合理的にこれらのタイムスタンプは、両方の時系列でソートされ、ユニークなことを期待することができます。

しかし、私は2つのタイムスタンプの間にあるログファイルの部分を抽出する問題に就いています。私のファイルに

最初のタイムスタンプは、私が使用しています21:28:45.631

構文は、例えば、私のファイルに21:27:57.545 最後のタイムスタンプであるさ

sed -n '/21:28:10*/,/21:28:22*/p' 

これは21:28:10*

開始時間が、私はそれが右に開始されるように前が21:28:09.484たように良い、これまで(21:28:10.043から始まるタイムスタンプを提供します(私は確信してユーザー・エラー)午前いくつかの奇妙な結果を得ています場所)

しかし21:28:09*の開始時間は、私は同じように奇数21:28:00.003

終了時刻から始まるタイムスタンプを提供します。終了時刻が21:28:22*の場合、21:28:20.050までのタイムスタンプが生成されますが、それ以降はタイムスタンプがあることがわかります。

2017-05-10 21:28:21.278, 901 
2017-05-10 21:28:21.303, 901 
2017-05-10 21:28:21.304, 901 
2017-05-10 21:28:21.483, 901 
2017-05-10 21:28:22.448, 901 

したがって、これはsedが文字列をどのように解釈するかとは関係がありますか?私がやろうとしていることを行うための裏地が1つありますか?理想的には私はあなたが代わりに*.*を使用する必要があります(つまり、この場合はミリ秒単位)

TIA

+1

謝罪 - ちょうど発見http://stackoverflow.com/questions/23572749/perl-awk-or-sed-search-between-two-timestamps – Pascoe

+0

awk -F '[。]' '"21:28:19" <= $ 2 && $ 2 <= "21:28:21"は秒単位の精度では動作しますが、ミリ秒間は動作しません。しかし、それは私が以前に持っていたよりも近いです(私が引用した他のSOの質問から)。 まだ1ミリ秒精度の1つのライナーを探しています。 – Pascoe

+0

私は理論上awkを使って深夜からミリ秒を作成して印刷し、そのように境界を行うことができると認識しています。おそらく私の最高の選択肢? – Pascoe

答えて

1

実際のデータと同じ粒度まで、開始と終了のタイムスタンプを指定することができるだろう。

RE 21:28:10*ゼロ以上0文字が続くことができる21:28:1から始まる文字列と一致するであろう。

+0

ありがとうございます。これは2番目の細かさで動作しますが、秒とミリ秒の間の小数は干渉すると考えられるので、ミリ秒単位で複製できません。私はそれをエスケープしようとしました。 のsed -n '/21:27:58\.500.*/,/21:27:59\.500.*/p' infile.csv> outfile.csv しかし、それはdidnの」何かを印刷する – Pascoe

+0

plzはあなたの 'infile.csv'を表示するか、誰が何が間違っているのか把握することはできません。 – pynexj

0

あなたが本当にクレイジー取得したい場合:

#!/bin/bash 
T1="$(date -d '2017-05-10 21:28:21' +'%s').300" # your start time 
T2="$(date -d '2017-05-10 21:28:21' +'%s').400" # your end time 
while read L 
do 
    D="$(echo $L | cut -c1-19)" # assuming line starts with timestamp 
    T=$(date -d "$D" +'%s') 
    T="${T}.$(echo $L | cut -c21-23)" 
    if [ $(echo $T'>'$T1 | bc -l) == 1 ] && [ $(echo $T'<'$T2 | bc -l) == 1 ] 
    then 
     echo "HIT: $L" 
    else 
     echo "NO!: $L" 
    fi 
done < your_log_file