我有一个具有此模式的日志文件。
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 = 102Time =后面的行总是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如果我像cat test.txt | awk '/Time/{getline;getline;print}'一样使用awk,它会显示
GAMG: Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
Time = 101
Time = 102Time = 101和Time = 102是ExecutionTime之后的两行。
简单地说,我只想得到Time =之后的第一个非空行,我知道它总是Iterations 1。我怎么能拿到呢?
发布于 2020-07-22 07:49:16
如果要绝对确定在No Iterations 1行之后打印以Time = ...结尾的第一行,可以使用以下awk命令:
awk '/^Time =/ {f=1} /No Iterations 1$/ && f {f=0; print}' test.txt这个awk命令有两个规则({ ... })。
^Time =匹配,即以字符串Time =开头,则将处理第一个表达式。在这个规则中,我们简单地将一个标志f设置为1,以指示找到了模式的“起始线”。No Iterations 1$匹配,即它以字符串No Iterations 1结尾,则将处理下一行,而且我们以前已经找到了Time =-line。如果满足这两种条件,则打印行,并重新设置标志f,这样我们就不会打印以No Iterations 1结尾的任何以下行。一个更“轻松”的变体(它只是在Time = ...语句之后打印第一个非空行(不检查它是否包含No Iterations 1模式)将是:
awk '/^Time =/ {f=1; next} NF>0 && f {f=0; print}' test.txt这只需查看是否设置了标志f,并且行中的“字段数”(或列数)大于零。注意,在这里,我们必须在第一条规则中添加一个next命令,以跳过执行到下一行,否则,NF>0-rule已经为Time =-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 1https://unix.stackexchange.com/questions/599702
复制相似问题