2つのタイムスタンプ間のログを抽出する方法、行は日付/時刻で開始または開始されないことがあります。

2つのタイムスタンプ間のログを抽出する方法、行は日付/時刻で開始または開始されないことがあります。

2つのタイムスタンプ間のログを抽出する方法、行は日付/時刻で開始することも、開始しないこともあります。以下で試しましたが、日付/時刻で始まる行のみを抽出します。日付時刻の形式は次のとおりです。2014-04-07 23:00

$ awk \
  '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]/
      {
        if ($1" "$2 >= "2014-04-07 23:00")     p=1;
        if ($1" "$2 >= "2014-04-08 02:00")  p=0;
      }
    p { print $0 }' log

私のサンプルデータは次のとおりです。

2014-04-07 22:59:10.001 agaggagag  
gagagg 
2014-04-07 23:40:33.345 aegsgssdh  
wqtqttqtqtq  
post  
agggsdgg  
2014-04-08 01:00:54.777 ggsdgwettwetewt  
cvdgwetegdkiytitityi  
error 
2014-04-08 02:02:22.009 qwwqtwtwebbcbewdhshsdh  
asgsaftewtewt  
1253536443755475  
2014-04-08 10:55:34.934 etwtewtewppip  
jklhlljkjvncncmmm  
sghywywywywyw  

2014-04-07 23:00との間のすべてのデータを抽出したいと思います。2014-04-08 02:00

答え1

パターンマッチングでは、RE の先頭は^式を行の先頭にバインドします。式がどこにでも一致するようにするには、その式を削除する必要があります。

あなたのif...声明は、日付/時刻フィールドがおよび$1にあると仮定します$2。これは定義によって必ずしも真ではないかもしれません。これを試してみてください(あなたのデータサンプルがないのでテストされていません)。

awk '
    {
        if (match($0, /\<[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]\>/))
        {
            s = substr($0, RSTART, RLENGTH)            
            if (s >= "2014-04-07 23:00") p=1
            if (s >= "2014-04-08 02:00") p=0
        }
    }
    p { print $0 }
' log

サンプルデータ出力

2014-04-07 23:40:33.345 aegsgssdh
wqtqttqtqtq
post
agggsdgg
2014-04-08 01:00:54.777 ggsdgwettwetewt
cvdgwetegdkiytitityi
error

答え2

スクリプトの先頭を次に変更します。

$awk\
  '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0- 9]/\
      {

または

$awk\
  '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0- 9]/{

現在、スクリプトには3つのステートメントがあります。

  1. 行が一致すると/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]/印刷します(デフォルトの動作)。
  2. すべての行(デフォルト条件)に対してp範囲内にある場合は1に設定され$1 $2、範囲内にない場合は0に設定されます。
  3. p0以外の場合は、その行を印刷します。

だからすべて日付タイムスタンプ(正規表現ベース)のように見える行は、ステートメント1に基づいて印刷されます。日付タイムスタンプを含む選択項目内の各行は、ステートメント2と3の間の対話に基づいて印刷されます。

明らかに、条件1とステートメント2を一緒にバインドしようとしています。

答え3

あなたの目的に合わせて簡単なスクリプトを作成しました。これが役立つことを確認してください。

[upkar@server2 一]#猫logxtract.sh

L1=$(grep -n "2014-04-07 23:[0-9][0-9]" ログ | awk -F":" '{print $1}')

L2=$(grep -n "2014-04-08 02:[0-9][0-9]" ログ | awk -F":" '{print $1}')

sed -n $L1,"$L2"p ログ

スクリプト出力

[upkar@server2 一]#sh logxtract.sh

2014-04-07 23:40:33.345 aegsgssdh

wqtqttqtqtq

post

agggsdgg

2014-04-08 01:00:54.777 ggsdgwettwetewt

cvdgwetegdkiytitityi

error

2014-04-08 02:02:22.009 qwwqtwtwebbcbewdhshsdh

関連情報