web-dev-qa-db-ja.com

Linuxで2つの日付範囲の間のすべてのログ行を取得する方法

Linuxで2つの日付範囲の間のすべてのログ行を取得するにはどうすればよいですか?私は次のような特定のコマンドを試しました

_1)awk '$0>=from&&$0<=to' from=\"Wed 21 Mar 14:52:08\" to=\"Wed21 Mar 
14:53:08\" /home/db2inst1/logs/tracestart.log 
_

しかし、それは私にそれらの正確な日付を持っているそれらの行だけを与えます。

_2) sed -n '/Wed 21 Mar 14:52:00/,/Wed 21 Mar 14:53:08/p'  
/home/db2inst1/logs/tracestart.log  /home/db2inst1/logs/traceend.log 
_

これは正しいデータを提供しますが、date(Wed 21 Mar 14:52:00)は完全に一致する必要があります。そうでない場合、最も近い時間の出力もありません。たとえば、_Wed 21 Mar 14:52:01_が開始時刻の場合、出力もありません。

ログファイルのサンプル::

_2018-04-04 11:40:46 INFO  RestAssuredService:184 - some thing.......
2018-04-04 11:40:48 INFO  RestAssuredService:199 - some thing.......
2018-04-04 11:40:48 INFO  RestAssuredService:177 -
*********invokeService is 
2018-04-04 11:40:48 INFO  ProductInfoTest:57 - Response Map::::: 
{RESPONSE_TYPE=application/json, EXPECTED_RESPONSE={
"products": [
    {
        "id": 23001,
        "type": "SHIRT",
        "description": "Mens Wear Dresses",
        "price": 850,
        "brand": "PETER_ENGLAND"
    },
    {
        "id": 23002,
        "type": "KURTI",
        "description": "Womens Wear Dresses",
        "price": 899,
        "brand": "ALLEND_SOLEY"
    }
] }, 
ACTUAL_RESPONSE=com.jayway.restassured.internal.RestAssuredResponseImpl@7d48651a}
2018-04-04 11:40:48 INFO  ProductValidator:47 - EXPECTED_RESPONSE:::: {
"products": [
    {
        "id": 23001,
        "type": "SHIRT",
        "description": "Mens Wear Dresses",
        "price": 850,
        "brand": "PETER_ENGLAND"
    },
    {
        "id": 23002,
        "type": "KURTI",
        "description": "Womens Wear Dresses",
        "price": 899,
        "brand": "ALLEND_SOLEY"
    }
] }
2018-04-04 11:40:48 ERROR ProductInfoTest:65 - Exception occured::: null
2018-04-04 11:40:48 INFO  ProductInfoStepDefinations:27 - addProductDetailsApiTest Starting::::
2018-04-04 11:40:48 INFO  ProductInfoTest:53 - getAllProductsInfo starting
2018-04-04 11:40:48 INFO  RestAssuredService:170 -
*********invokeService is starting*********
2018-04-04 11:40:48 INFO  RestAssuredService:247 - Final uri:::::: rest/market/item/info
2018-04-04 11:40:48 INFO  RestAssuredService:258 - HeaderParametersMap :::::: {Accept=application/json, Content-Type=application/json
_
2
Irfan

単純な「時間」環境(タイムゾーン変換なし、夏時間の変更なし)を想定すると、日付範囲をエポック以降の秒数でawkに指示し、次に各日付をエポック以降の秒数に変換して印刷することができます。その範囲内の行のみ:

awk -v from=$(date -d "2018-04-04 11:40:45" +%s) \
    -v   to=$(date -d "2018-04-04 11:40:47" +%s) \
 '{ "date -d \""$1 " "$2"\" +%s" | getline s; 
    if (from <= s && s <= to) print;
  }' < input
2018-04-04 11:40:46 INFO  RestAssuredService:184 - some thing.......

すべての行に対してdateを呼び出すため、特に効率的ではありません。それが問題になる場合は、ルックアップをキャッシュするように拡張できます。

1
Jeff Schaller

Javaアプリケーションからのログファイルに頻繁に使用するもう1つのアプローチは、タイムスタンプの最初の出現の行番号を見つけることです。

FROM_DATE="Wed 21 Mar 14:52:08"
TO_DATE=""Wed 21 Mar 14:53:08"

FROM_LINE=$(grep -n -m 1 ${FROM_DATE} ${FILE} | cut -d ":" -f 1)
TO_LINE=$(grep -n -m 1 ${TO_DATE} ${FILE} | cut -d ":" -f 1)

次に、その間の情報を提供します。

tail -n "${FROM_LINE}" ${FILE} | head -n $(expr $TO_LINE - $FROM_LINE)

または経由

sed -n -e "${FROM_LINE},${TO_LINE} p" -e "${TO_LINE} q" ${FILE}

これにより、スタックトレース、REST APIコンテンツ、JSON構造など)がキャッチされます。

Hadoopフレームワークなどの特定のアプリケーションでは、ログファイルを操作するための特定のスクリプトがあります。 from Jeffは、2つのイベント間の時間を計算するために使用しているdateを使用したアプローチについて言及しました。

詳細情報(および参照):

0
U880D