首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从日志文件中提取信息

从日志文件中提取信息
EN

Stack Overflow用户
提问于 2020-06-24 02:52:38
回答 2查看 48关注 0票数 2

我有一个日志文件,它具有以下结构。我想在每一行中的"Initial residual =“文本之后获取信息,并将其导出到.txt文件中。

代码语言:javascript
复制
Time = 1996

smoothSolver:  Solving for Ux, Initial residual = 0.000674461, Final residual = 9.44251e-07, No Iterations 5
smoothSolver:  Solving for Uy, Initial residual = 0.00478922, Final residual = 7.06574e-07, No Iterations 7
GAMG:  Solving for p, Initial residual = 0.00899, Final residual = 9.67531e-07, No Iterations 10
time step continuity errors : sum local = 2.63988e-05, global = 4.03835e-06, cumulative = -1.29495e-05
smoothSolver:  Solving for epsilon, Initial residual = 0.00209075, Final residual = 3.67614e-07, No Iterations 6
smoothSolver:  Solving for k, Initial residual = 0.0017321, Final residual = 9.33393e-07, No Iterations 6
ExecutionTime = 27.9 s  ClockTime = 28 s

Time = 1997

smoothSolver:  Solving for Ux, Initial residual = 0.000659293, Final residual = 9.46747e-07, No Iterations 5
smoothSolver:  Solving for Uy, Initial residual = 0.00479541, Final residual = 7.03185e-07, No Iterations 7
GAMG:  Solving for p, Initial residual = 0.00975341, Final residual = 9.64034e-07, No Iterations 10
time step continuity errors : sum local = 2.6336e-05, global = 3.87822e-06, cumulative = -9.07129e-06
smoothSolver:  Solving for epsilon, Initial residual = 0.00213882, Final residual = 3.64484e-07, No Iterations 6
smoothSolver:  Solving for k, Initial residual = 0.00172913, Final residual = 9.36427e-07, No Iterations 6
ExecutionTime = 27.91 s  ClockTime = 28 s

.txt文件的结构如下

代码语言:javascript
复制
1996 0.000674461 0.00478922 0.00899 0.00209075 0.0017321
1997 0.000659293 0.00479541 0.00975 0.00213882 0.0017291   
.
.

使用grep,我可以找到包含某个字符串的行。然后,我可以使用cut来提取某个列位置的数字,并将其写入文本文件中。例如,我使用以下命令从包含指定字符串的行中提取信息:

代码语言:javascript
复制
cat log | grep 'Solving for Ux' | cut -d' ' -f9 | tr -d ',' > resy.txt
cat log | grep 'Solving for Uy' | cut -d' ' -f9 | tr -d ',' > resy.txt

但我想检查是否有其他方法可以提取与两个字符串对应的所有信息。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-24 03:53:47

这是一种丑陋的方式,但可以为您工作:

代码语言:javascript
复制
#!/bin/bash
INPUT="/path/to/log.txt"
OUTPUT="/path/to/output.txt"
LINE=""
while IFS= read -r line
do
  echo "$line" | grep ^Time > /dev/null
  if [ $? -eq 0 ] ; then
    if [ -n "$LINE" ] ; then
      echo $LINE
    fi
    LINE=""
    LINE="${LINE}${line#*= }"
  else
    echo -e "$line" | grep "Initial residual" > /dev/null
    if [ $? -eq 0 ] ; then
      value=$(echo ${line} | sed -e 's/.*Initial residual = \(.*\), Final.*/\1/')
      LINE="${LINE} $value"
    fi
  fi
done < "$INPUT"
echo $LINE

输出:

代码语言:javascript
复制
1996 0.000674461 0.00478922 0.00899 0.00209075 0.0017321
1997 0.000659293 0.00479541 0.00975341 0.00213882 0.00172913
票数 0
EN

Stack Overflow用户

发布于 2020-06-24 04:11:10

使用awk

代码语言:javascript
复制
awk -F 'Initial residual = ' -v out=out.txt '
/^Time =/ {
sub("Time = ","")
i++
if (i>1){nl="\n"}
printf nl$0" " > out
}

/Initial residual/ {
sub(",.*","",$2)
printf $2" " > out
}

END {print "" > out}' log
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62541833

复制
相关文章

相似问题

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