ファイルの一番下から始めて、2つのタイムスタンプ間の文字列を検索します。

ファイルの一番下から始めて、2つのタイムスタンプ間の文字列を検索します。

私はCannot proceed: the cube has no data巨大なtest.txtファイルで昨日の午後22時30分と今日の午前00時30分の間のタイムスタンプの間にある文字列を見つけようとしています。

スクリプト:

tac test.txt | awk -v today=$(date "+%d") -v yesterday=$(date "+%d" -d yesterday) '/Cannot proceed: the cube has no data/ {f=$0; next} f{if (($3==yesterday && $4>"22:30:00") || ($4==today && $4<="00:30:00")) {print; print f} f=""}'

テスト.txt:

[Thu Jun  8 07:56:17 2014]Local/data///47480280486528/Info(1019022)
Writing Database Mapping For [data]

[Thu Jun  8 12:56:38 2014]Local/data///47480280486528/Info(1250008)
Setting Outline Paging Cachesize To [8192KB]

[Thu Jun  8 22:56:20 2014]Local/data///47480280486528/Info(1013202)
Cannot proceed: the cube has no data 

[Thu Jun  8 23:26:18 2014]Local/data///47480280486528/Info(1013205)
Received Command [Load Database]

[Thu Jun  9 00:16:23 2014]Local/data///47480280486528/Info(1019018)
Writing Parameters For Database 

[Thu Jun  9 00:21:20 2014]Local/data///47480280486528/Info(1013205)
Writing Parameters For Database 

[Thu Jun  9 00:29:00 2014]Local/data///47480280486528/Info(1013205)
Cannot proceed: the cube has no data

[Thu Jun  9 01:25:21 2014]Local/data///47480280486528/Info(1019018)
Cannot proceed: the cube has no data 

出力:

[Thu Jun  8 22:56:20 2014]Local/data///47480280486528/Info(1013202)
Cannot proceed: the cube has no data

一致する文字列がすべて出力に表示されないのはなぜですか?私がここで何を見逃しているのでしょうか?

ベストアンサー1

私はawkそれに慣れていないので、動作について具体的なアドバイスをすることはできませんが、これがうまくいくと確信しています。

tac ./file |
sed -e "/$(date -d"2 days ago")/q" -e \
    '/Cannot proceed: the cube has no data/!d;h;n;G'

このようにファイルを上下に読み取ると、tacターゲットエラーが最初に来て、日付バーがその後に来る必要があります。したがって、hターゲットの後ろから前の行の最後の行に会い、次の行をドラッグして最後の行を最後に追加して効果的に並べ替えます。

d他のすべての行を削除します。

2日前の日付が見つかるまでこの検索を続け、その時点はq適切です。

おすすめ記事