从日志文件中提取信息

时间:2020-06-23 18:52:38

标签: bash grep

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

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文件将具有以下结构

1996 0.000674461 0.00478922 0.00899 0.00209075 0.0017321
1997 0.000659293 0.00479541 0.00975 0.00213882 0.0017291   
.
.

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

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

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

2 个答案:

答案 0 :(得分:0)

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

#!/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

输出:

1996 0.000674461 0.00478922 0.00899 0.00209075 0.0017321
1997 0.000659293 0.00479541 0.00975341 0.00213882 0.00172913

答案 1 :(得分:0)

使用awk

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