首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在文件中匹配后精确地获取特定行。

在文件中匹配后精确地获取特定行。
EN

Unix & Linux用户
提问于 2020-07-22 07:42:49
回答 1查看 52关注 0票数 0

我有一个具有此模式的日志文件。

代码语言:javascript
复制
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,它将显示

代码语言:javascript
复制
Time = 100

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

代码语言:javascript
复制
ExecutionTime = 27.35 s  ClockTime = 31 s

Time = 101

如果我像cat test.txt | awk '/Time/{getline;getline;print}'一样使用awk,它会显示

代码语言:javascript
复制
GAMG:  Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
Time = 101
Time = 102

Time = 101Time = 102ExecutionTime之后的两行。

简单地说,我只想得到Time =之后的第一个非空行,我知道它总是Iterations 1。我怎么能拿到呢?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-07-22 07:49:16

如果要绝对确定在No Iterations 1行之后打印以Time = ...结尾的第一行,可以使用以下awk命令:

代码语言:javascript
复制
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模式)将是:

代码语言:javascript
复制
awk '/^Time =/ {f=1; next} NF>0 && f {f=0; print}' test.txt

这只需查看是否设置了标志f,并且行中的“字段数”(或列数)大于零。注意,在这里,我们必须在第一条规则中添加一个next命令,以跳过执行到下一行,否则,NF>0-rule已经为Time =-lines进行了处理,实际上只打印了这些命令。

对于您的例子,这两种打印:

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/599702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档