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
_
単純な「時間」環境(タイムゾーン変換なし、夏時間の変更なし)を想定すると、日付範囲をエポック以降の秒数で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
を呼び出すため、特に効率的ではありません。それが問題になる場合は、ルックアップをキャッシュするように拡張できます。
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
を使用したアプローチについて言及しました。
詳細情報(および参照):