我有一个具有以下结构的日志文件。我想在每一行中的“初始剩余=”文本之后获取信息,并将其导出到.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
但是我想检查是否还有其他方法可以提取与两个字符串对应的所有信息。 谢谢。
答案 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