awkを使用して2つのタイムスタンプ間のログを抽出する

awkを使用して2つのタイムスタンプ間のログを抽出する

2つのタイムスタンプ間のすべてのログを抽出しようとしています。一部の行にはタイムスタンプがない場合がありますが、その行を含めたいと思います。 2つのタイムスタンプに属するすべての行が抽出されたログに含まれることを望みます。抽出されたログには、最初と最後のタイムスタンプ行も含める必要があります。

注:開始タイムスタンプまたは終了タイムスタンプがログにない場合がありますが、これら2つのタイムスタンプ間のすべての行を抽出したいと思います。

私のログタイムスタンプ構造は次のとおりです。2017年1月25日 07:06:16:860

私が書いたawkコマンドは、タイムスタンプだけを含む行を取得し、他のすべての行をスキップしてログend_time-1を取得することです。つまり、end_timeを11:30に指定すると、11:29までログを取得したり、時には非常に奇妙なこともあります。 。

私が書いたPFBコマンド:

awk -v date=${date} \
    -v start_time=${start_time} \
    -v end_time=${end_time} \
'{if (($0 >= date FS start_time) && ($0 <= date FS end_time)) print $0; }' \
     $log.$server_name.log > $requester_email.log 

このコマンドはスクリプトに含まれており、ユーザーに手動で詳細を入力するように要求するため、開始時刻と終了時刻を要求するときは、ユーザーはHH:MM形式で入力する必要があります。つまり、上記のタイムスタンプの場合、ユーザーは次の時間を入力します。07:06

誰でもここで私を助けることができればとても感謝します。

ログの例:

25-01-2017 07:23:51:772 [DEBUG] - sdsdsadadjhadsjhasdjhajhdahdkjhadjkhasjkdhjhg asdgahdgasdhghasdghagdshdhasgadahdghasdgasd
25-01-2017 07:23:51:772 [DEBUG] - asdasd.asdasd.asdasdas.asdasd.asdasda.dfsfd.cxzzxczxczcwdqweqwe.adadsasd.asdasdasdadasdadasd.adadasdasdasd.as: adasdasdadadasdsdfsdfsdfsfssdf..<Request xmlns="adasdadasdasdasdasdasdasadadasd" xmlns:xsi="http://www.w3.org/2001/">
  <Resource>
    <Attribute AttributeId="asdasdasasdasdasdasdasdasdasdasddaasdasdasdasdaas" DataType="http://www.w3.org/2001/XMLSchema#string">
      <AttributeValue>adasdasdasdasdasddasdasd</AttributeValue>
    </Attribute>
    <!--Check something somthing-->
    <Attribute 
    AttributeId="asdasdasasdasdasdasdasdasdasdasddaasdasdasdasdaas" DataType="http://www.w3.org/2001/XMLSchema#string">
      <AttributeValue>sdasddsd</AttributeValue>
    </Attribute>
  </Subject>
  <Action>
    <Attribute AttributeId="sdfsdfsdsdfsdfsdfsdfsdfsfxcvxvxcvvxvcxvwerqwr" DataType="http://www.w3.org/2001/XMLSchema#string">
      <AttributeValue>rsf</AttributeValue>
    </Attribute>
  </Action>
</Request>
25-01-2017 07:23:51:775 [DEBUG] - sdsdsadadjhadsjhasdjhajhdahdkjhadjkhasjkdhjhg asdgahdgasdhghasdghagdshdhasgadahdghasdgasd

ベストアンサー1

あなたのアプローチには2つの問題があります。

  1. 入力行全体をタイムスタンプとアルファベット順で比較できます。行が終了タイムスタンプで始まり、他の文字を含む場合はソートされます。後ろに短い文字列の後に長い文字列が続くからです。
  2. タイムスタンプで始まらない行を処理するルールはありません。開始タイムスタンプと終了タイムスタンプの間にソートされないため、出力には含まれません。この線はどのように識別されますか?

次のようにしてみてください。

$1 == date {
    start = substr($2, 0, length(start_time));
    end = substr($2, 0, length(end_time));
    if (start_time <= start && end <= end_time) print;
    next;
}
{ print; }

おすすめ記事