このパターンのログファイルがあります。
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 = 101
andです。Time = 102
ExecutionTime
簡単に言えば、私は空白ではなく最初の行を取得したいと思います。それ以降はTime =
常にIterations 1
。どうやって入手できますか?
答え1
No Iterations 1
1行で終わる最初の行が印刷されるようにするには、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