日志打印是软件必需的功能,通常C程序会将所有运行日志输出到指定LOG。
    一、有时候需要在C程序运行期间查看实时日志,最好地,可以根据关键字筛选自己想要查看的内容。
    二、有时候,希望另开Terminal去查看日志,而不是使用当前的Terminal。
    实时筛选流,利用tail命令可以实现,流显示则可以用tee命令;Linux设备自启Terminal窗口,利用gnome-terminal命令实现(在gnome集成桌面环境)。
关于tail命令
    tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。
关于tee命令
    tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
关于gnome-terminal命令
    如果想在启动Terminal中自动执行命令,有两个参数可以实现这个功能,-e和-x(或者"--"),这两个区别在于:
"-e"可以出现多次,如果在所有--window前面,表示对所有window和tab起作用,如果在--window或者--tab后面,表示只针对这个tab执行,要注意-e后面只能有一个参数也就是说如果有空格,需要用引号(-e选项会被提示不适用,后面版本可能移除)。
"-x"只能出现一次,在-x后面的所有内容,均认为是要执行的命令,所以可以出现空格,这些命令是针对所有tab都执行的。

如果C程序直接将日志打印到屏幕,那么可以使用重定向符">"或者">>"将流先重定向到指定LOG文本,然后利用tail命令实时显示到启动的Terminal窗口:

gnome-terminal --title="LOG_PRINT" -- bash -c "tail -f ./test.log"

利用"bash -c"在bash里面再启用一个bash,执行log的分流命令(避免在test.log未增加时新开Terminal闪退)。
对于日志的筛选可以使用正则表达式作为筛选条件或者shell脚本的命令行参数,脚本判断筛选条件之后动态创建多个分流Terminal窗口显示包含指定关键字的日志内容。类似于:

/INFO/p
/ATA*|BTB*/p

“/p” 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
    利用for循环动态处理分流条件RE,将主日志分流导入到各分日志并显示在窗口:

touch $TESTLOG
for (( i =1; i < $#; i++))doRE=$1eval RE="$"$iTERMINAL_TITLE=RE_NO."$1"_LOGPRINTtouch $LOGPATH/RE_$i.logecho "RE_NO.${i}_LOGPRINT display result of regular expression: $RE"CMD="tail -f $TESTLOG | sed -un \"$RE\" | tee RE_$i.log"gnome-terminal --title="$TERMINAL_TITLE" -- bash -c "$CMD"shiftdone
fi

另外在这之后新开一个Terminal用于显示所有日志:

gnome-terminal --title="MAIN_LOGPRINT" -- tail -f $TESTLOG

最后考虑执行c程序:

./Test >> $TESTLOG

把C程序执行放到脚本的最后是为了使用CTRL+C可以一键终止C程序的打印,否则将失去对C程序的控制,因为shell脚本默认以脚本最后一个进程接收CTRL+*命令。所以这里执行命令的顺序是重点需要注意的地方,也因此在前面会使用bash命令。
   另外,程序输出有两种方式:一种是即时处理方式,另一种是先暂存起来,然后再大块写入的方式,前者往往造成较高的系统负担。因此,c语言默认按块输出。为了让日志可以实时刷新,还需要在C程序中设置输出缓存:

setbuf(stdout, NULL);

shell脚本实现C程序日志分流和多Terminal显示相关推荐

  1. shell脚本触发java程序支持传参补跑_01

    文章目录 一.java程序 1. 创建java项目 2. 创建包结构 3. 创建java类 4. 编译 5. 编译后的包结构总览 二.shell脚本 2.1. 创建基础目录 2.2. 上传项目到指定目 ...

  2. linux配置定时删除日志文件,Linux使用shell脚本定时删除历史日志文件

    Linux使用shell脚本定时删除历史日志文件,文件,小时,时间,目录,脚本 Linux使用shell脚本定时删除历史日志文件 易采站长站,站长之家为您整理了Linux使用shell脚本定时删除历史 ...

  3. shell脚本触发java程序支持传参补跑 +crontab定时器+每天生成日期文件_03

    文章目录 1. 脚本升级 2. 执行测试 3. 脚本关键词简述 补充案例 上一篇: shell脚本触发java程序支持传参补跑 +crontab定时器_02 https://gblfy.blog.cs ...

  4. shell脚本触发java程序支持传参补跑 +crontab定时器_02

    文章目录 1. 创建定时任务 2. 查看定时任务是否执行 上一篇: shell脚本触发java程序支持传参补跑_01 https://gblfy.blog.csdn.net/article/detai ...

  5. Linux Shell脚本 Linux C程序 获取指定的范围内 or 系统可用端口

    Linux Shell脚本 && Linux C程序 获取指定的范围内 or 系统可用端口 一.源代码及其运行 1. Linux C程序getPort.c 源码 运行示例 2. 脚本文 ...

  6. nginx日志报警|微信公众号推送预警消息|PHP+shell脚本实现nginx错误日志报警恶意访问报警,实时通知到微信公众号 | 小型网站nginx日志报警轻量级方案

    1.shell脚本 命名:run.sh #!/bin/bash #!/usr/bin/python # -*- coding:utf-8 -*- #日志文件路径 accesslog=/www/wwwl ...

  7. 教你用shell脚本检测服务器程序是否在运行

    shell脚本定时检测python程序是否运行 shell脚本 #!/bin/bashecho "开始检查运费fright_run程序是否运行..."cd /opt/gh2/app ...

  8. 编写一个弹出式菜单的shell程序_分享一个有趣的shell脚本--实现抓阄程序

    概述 今天主要分享一个有趣的shell脚本,用来实现抓阄,平时就不用剪刀石头布了. 需求 使用shell编写一个抓阄的程序: 1.执行脚本后,输入英文名字全拼,产生随机数01-99之间的数字,数字越大 ...

  9. shell脚本启动停止程序

    目录 shell脚本启动停止重启单个程序 shell脚本启动停止多个程序 编写shell脚本执行springboot项目 jar包 编写shell脚本执行python脚本以及其他程序 shell脚本启 ...

最新文章

  1. 纳税服务系统十一【抽取BaseService、条件查询】
  2. HDU 3949 XOR 线性基
  3. Visual Studio 的键盘快捷方式
  4. python selenium webdriver_Python:selenium.webdriver问题(服务器上没有X)
  5. 爱情,是我一生中最虔诚的信仰
  6. 【linux】服务器运维必备之linux常用命令合集
  7. 青海师范大学云上健身计算机学院,尹君-欢迎光临青海师范大学计算机学院
  8. Python 购物车
  9. Gitflow branch与Docker image tag命名冲突怎么办?
  10. 基础算法 —— 模拟思维
  11. java websocket原理_Java WebSocket基本原理
  12. 高级网络配置+Ipv6
  13. KVM虚拟化技术(理论理解以及虚拟化平台搭建步骤)
  14. 【OpenCV】“帧差法”实现移动物体的检测(车辆识别)
  15. easyui事件方法onChange()、onSelect()、 onLoadSuccess()
  16. Linux基础命令(管理工具)
  17. redis之AOF和RDB持久化
  18. 京东java前后端联调_前端工程化、组件化实践JDM分享
  19. 基于Springboot的网上商城
  20. 【Xilinx DMA SG】Xilinx DMA SG 模式

热门文章

  1. 图像处理 100 问!!
  2. 【CV】吴恩达机器学习课程笔记第18章
  3. zen3架构_AMD Zen3架构处理器的L3缓存或将翻倍到64MB
  4. HDU-1459.非常可乐(BFS )
  5. Pandoc PDF 中文
  6. 零基础学习python_异常处理(32-33课)
  7. Java并发编程之——BlockingQueue(队列)
  8. 【java线程】锁机制:synchronized、Lock、Condition
  9. Go 学习笔记(7)— 常量定义、常量使用、枚举用法、iota 常量、不设置初始值常量
  10. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-新增模块管理界面导出功能(可按条件导出)...