OpenFOAM实用脚本之cat和管道命令grep提取文本信息

本文介绍使用cat和grep等命令构造脚本,提取log文件中的信息,方便CFD的后处理。一般来说,OpenFOAM都有自带的后处理功能,如controlDict中的functions,以及postProcess指令,里面包含了非常之多的后处理功能。但是,在一些情况下,如果求解器在终端中就能输出我们所需要的的信息,而特地编写functionObject库又太过于费时费力,那么就可以通过cat等指令来抓取求解器输出的log文件(一般在solver后面加 > log.solver)中特定的信息,形成对应的文档。这样,就不必费心编写多余的程序,也能满足需要了。

本文用到的素材是动网格-涡激振动的log.pimpleFoam文件。刚好,圆柱的位移、速度等信息OpenFOAM似乎都没有对应的后处理功能来输出。因此,用cat和grep命令对特定的位移,速度信息进行提取,并按后处理软件如tecplot的格式进行保存。需要抓取的信息如下:

Time = 0.2573

Restraint verticalSpring:  attachmentPt - anchor (0.000478047 1.13871e-06 0) spring length 0.000478049 force (-0.00108565 -2.586e-06 -0)
6-DoF rigid body motion
    Centre of rotation: (0.000478047 1.13871e-06 0)
    Centre of mass: (0.000478047 1.13871e-06 0)
    Orientation: (1 0 0 0 1 0 0 0 1)
    Linear velocity: (0.00861405 -5.38938e-05 0)
    Angular velocity: (0 0 0)

其中,需要抓取的是时间(Time后面的数字)、质心(mass后面的数字)以及质心速度(Linear velocity后面的数字)。下面直接放脚本makeFiles:

cat log | grep 'Time =' | cut -d' ' -f3 > time
cat log | grep 'of mass' | cut -d' ' -f8 | tr -d '('  > xcenter
cat log | grep 'of mass' | cut -d' ' -f9 > ycenter
cat log | grep 'of mass' | cut -d' ' -f10 | tr -d ')'  > zcenter
cat log | grep 'Linear' | cut -d' ' -f7 | tr -d '(' > vx
cat log | grep 'Linear' | cut -d' ' -f8 > vy
cat log | grep 'Linear' | cut -d' ' -f9 | tr -d ')' > vz

paste time xcenter ycenter zcenter vx vy vz > plotfile
rm time v* *center

在终端输入./makeFiles,得到plotfile文件:

0.2573	0.000478047	1.13871e-06	0	0.00861405	-5.38938e-05	0

对应Time,质心位置x、y、z以及质心速度u、v、w。下面详细讲解脚本上每一个符号的作用。

cat log

是linux的一个命令,全称是concatenate(连接),用于连接文件并打印到标准输出设备上。cat的一个用法就是把一个文件的内容复制到另一个文件中去:

cat file1 > file2

但是,我们要用的是部分需要提取的信息,为此,将读到的文本作为输入,传递到下一个指令中(管道符和管道命令)进行再次加工。

grep

grep是其中一类管道命令,作用是选取。其本身在linux中也是常用的指令,用于查找文本中符合条件的字符串。如首行grep 'Time ='就是抓取包含字样的所有行。

cut -df

Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字。-d表示自定义分隔符,默认为制表符。-f与d一起使用,指定显示哪个域。如此 -d ' ' 表示将分隔符定义为空格,-f3表示取第3个域,也就是Time(1) =(2) 0.2573(3),提取到了0.2573这个数字域。这和excel的分隔功能有点类似。这需要观察该行数据的结构。如果需要批量抓取的话,这些信息基本上结构都是一致的,找到位置就好。

tr -d

Linux tr命令用于转换或者删除文件中的字符。-d表示删除字符串中定义的字符。如这一行:

    Centre of mass: (0.000478047 1.13871e-06 0)

我们用cut -d ' ' -f8来抓到(0.000478047这个域的字符串。为什么是第八个?因为在Centre之前有4个空格,-f5才是Centre,然后6号是of,7号是mass,再到8号才是(0.000478047。这时,‘(’是不需要的,会影响后处理软件读取。tr -d '(' 帮我们将这个字符串中的左括号去掉了,只输出数字。

参考:

Linux cat 命令 | 菜鸟教程

linux管道符“|”详解 – 阿泰555 – 博客园

Linux grep 命令 | 菜鸟教程

Linux字符截取命令-cut_小小工匠的博客-CSDN博客_cut命令

linux tr命令详解_草原苍狼的博客-CSDN博客_linux tr

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片