ファイル内の一致する項目の後に続く特定の行を取得します。

ファイル内の一致する項目の後に続く特定の行を取得します。

このパターンのログファイルがあります。

Time = 100

GAMG:  Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
GAMG:  Solving for p, Initial residual = 0.02692910633, Final residual = 0.0004864615367, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.005753534485, Final residual = 0.0001502172182, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.001526301953, Final residual = 5.384448346e-05, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.0004529702305, Final residual = 1.80754637e-05, No Iterations 1
time step continuity errors : sum local = 2.722585271, global = 0.09763545089, cumulative = 0.09763545089
ExecutionTime = 27.35 s  ClockTime = 31 s

Time = 101

GAMG:  Solving for p, Initial residual = 0.04799119366, Final residual = 0.002390404161, No Iterations 1
GAMG:  Solving for p, Initial residual = 0.02803010067, Final residual = 0.0009371130484, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.007210353379, Final residual = 0.0002494798057, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.002410795933, Final residual = 0.000116871876, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.0007431402835, Final residual = 1.649739876e-05, No Iterations 3
GAMG:  Solving for p, Initial residual = 0.0003489407136, Final residual = 1.262095062e-05, No Iterations 1
time step continuity errors : sum local = 0.7142966337, global = -0.1125594528, cumulative = -0.01492400189
ExecutionTime = 41.42 s  ClockTime = 45 s

Time = 102

次の行はTime =常にですIterations 1。私はその行を取得したいと思います。私は次のアイデアを試しました。

grepを使って書くと、次のようにgrep -A 2 "Time =" test.txt表示されます。

Time = 100

GAMG:  Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1

そして

ExecutionTime = 27.35 s  ClockTime = 31 s

Time = 101

awkを使用するとcat test.txt | awk '/Time/{getline;getline;print}'表示されます。

GAMG:  Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
Time = 101
Time = 102

その後の2行はTime = 101andです。Time = 102ExecutionTime

簡単に言えば、私は空白ではなく最初の行を取得したいと思います。それ以降はTime =常にIterations 1。どうやって入手できますか?

答え1

No Iterations 11行で終わる最初の行が印刷されるようにするには、Time = ...次のawkコマンドを使用します。

awk '/^Time =/ {f=1} /No Iterations 1$/ && f {f=0; print}' test.txt

このawkコマンドには2つの規則({ ... })があります。

  • ^Time =行が正規表現と一致する場合、つまり文字列で始まると、最初の行が処理されますTime =。このルールでは、見つかったパターンの「開始線」を示すfフラグを設定するだけです。1
  • No Iterations 1$行が正規表現と一致する場合は、次の処理を行います。終わる文字列を使用してくださいNo Iterations 1そして我々はそれを以前に発見したTime =- 良いです。両方の条件が満たされている場合は、行を印刷してから始まる次の項目がf印刷されないようにフラグをリセットしますNo Iterations 1

ステートメントの後に空でない最初の行だけを印刷するTime = ...(パターンが含まれていることを確認せずにNo Iterations 1)、もう少し「緩和された」バリアントは次のとおりです。

awk '/^Time =/ {f=1; next} NF>0 && f {f=0; print}' test.txt

fこれは、フラグが設定されていることと、行NFの「フィールド数」(または必要に応じて列数)がゼロより大きいことを確認するだけです。ここではnext、次の行に実行をスキップするために、最初のルールにコマンドを追加する必要があります。それ以外の場合、-ruleはNF>0すでにTime =-linesに対して処理され、その-linesのみが効果的に印刷されます。

あなたの例は、両方印刷します:

GAMG:  Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
GAMG:  Solving for p, Initial residual = 0.04799119366, Final residual = 0.002390404161, No Iterations 1

関連情報