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

2023-10-29

    日志打印是软件必需的功能,通常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++))
    do
        RE=$1
        eval RE="$"$i
        TERMINAL_TITLE=RE_NO."$1"_LOGPRINT
        touch $LOGPATH/RE_$i.log
        echo "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"
        shift
    done
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);

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell脚本实现C程序日志分流和多Terminal显示 的相关文章

  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • 无需 root 访问权限即可安装 zsh? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有可能 以及如何 我确实需要在几台具有 ssh 访问权限 但没有 root 访问权限 的远程计算机上使用此功能 下载 zsh wget O zsh t
  • sh read 命令会吃掉输入中的反斜杠吗?

    也许最容易用一个例子来解释 echo echo while read in do echo in done 看来read命令将输入 中的反斜杠解释为转义符并删除它们 我需要逐行处理文件而不更改其内容 并且我不知道如何停止在这里智能读取 有任
  • 如何重命名 .tar.gz 文件而不提取内容并在 UBUNTU 中创建新的 .tar.gz 文件?

    我有一个命令将创建一个新的 tar gz现有文件中的文件 sudo tar zcvf Existing tar gz New tar gz 该命令将创建一个新的New tar gz从现有的文件Existing tar gz file 谁能告
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t
  • Python将文件从Linux复制到WIndows

    我正在构建一个网站 该网站有一个表单 可以捕获用户数据并在用户数据上运行一些cgi cgi 的第一步是需要将文件从 Linux Web 服务器复制到 Windows 计算机 服务器将使用 Active Directory 角色帐户作为复制凭
  • 为什么docker容器提示“权限被拒绝”?

    我使用以下命令来运行 docker 容器 并从主机映射目录 root database 到容器 tmp install database docker run it name oracle install v root database t
  • 可以作为命令行参数传递多少数据?

    在 Linux 下生成进程时可以发送多少字节作为命令行参数 gahooa 推荐了一篇好文章http www in ulm de mascheck various argmax http www in ulm de mascheck vari
  • 如何在perl中使用O_ASYNC和fcntl?

    我想使用 O ASYNC 选项 当管道可以读取时 SIGIO 的处理程序将运行 但以下代码不起作用 任何人都可以帮助我吗 bin env perl use Fcntl SIG IO sub print catch SIGIO n my fl
  • 使用运算符 j 操作 zsh 数组

    以下代码摘自here http eseth org 2010 git in zsh html function vi git st local ahead behind remote local a gitstatus Are we on
  • 如何使用 bash 中提供的工具生成一系列非周末日期?

    我想生成一个文件列表 其中名称包含 filename date 例如file 20111101 file 20120703 开始November 1 2011直到今天 应该不包括周末 Thanks 2011年试试这个 for y in 20
  • Visual Studio - X11:缺少 DISPLAY 环境变量

    我正在使用 Visual Studio 2019 Enterprise 开发跨平台 Windows Linux x64 GUI 应用程序 在这个 2019 版本中 我们可以使用 Visual Studio调试平台 Windows 本机 和
  • 用于时间线数据的类似 gnuplot 的程序

    我正在寻找一个类似 gnuplot用于在时间轴中绘制数据图表的程序 类似 gnuplot 在 Linux 上运行 命令行功能 GUI 对我帮助不大 可编写脚本的语法 输出为 jpg png svg 或 gif 输出应该是这样的 set5 s
  • 在 C# 中编写批处理脚本的好方法是什么?

    我想用 C 编写简单的脚本 我通常会使用 bat 或 4NT btm 文件 复制文件 解析文本 询问用户输入等等 相当简单 但在批处理文件中正确执行这些操作确实很困难 例如没有例外 我熟悉像 AxScript 这样的命令行 脚本 包装器 这
  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na

随机推荐

  • Polyman 初使用-01

    软件安装很easy 不赘述 启动软件 打开 edf文件 左侧是不同的通道名称 每页是一个epoch 也就是 30s 左下角的三角可以翻页 速度有点慢 我们可以拖动右上方方框里的白色竖条进行时间拉伸 红色填充是每个阶段的标签 这个是额外引入的
  • 由于您访问的url有可能对网站造成安全威胁_Web常见安全漏洞-XSS攻击

    XSS攻击 跨站脚本攻击 Cross Site Scripting 为了不和层叠样式表 Cascading Style Sheets CSS 的缩写混淆 故将跨站脚本攻击缩写为XSS XSS是一种常见的web安全漏洞 它允许攻击者将恶意代码
  • 区块链风暴来袭,这五大行业将受到强烈冲击

    自从第一枚比特币诞生以来 加密货币就代表了经济实现重大飞跃的一次机会 尽管比特币出现了 没有中心化的机构 并且成为了传统货币的数字化选择 驱动加密货币运作的底层计算机协议则是从之后才被认为具备大量其他的应用场景 从分布式账本的不可更改性到加
  • salt-key收集的主机名与实际主机名不一致

    salt key收集的主机名与实际主机名不一致 一 问题背景 root host 39 108 217 12 minions salt key L iZbp150ikdomqe3b32qaubZ izwz9f8xrvty50quc2gq50
  • Redhat6.5安装vnc服务远程桌面

    环境 操作系统 Redhat6 5 已安装桌面 远程工具 Xshell6 VNC服务 可以远程将桌面输出 tigervnc tigervnc server ssh远程到服务器之后 yum安装tigervnc tigervnc server
  • CKA认证题型解析

    文章目录 0 前言 1 RBAC 授权 2 节点设置不可用 3 升级 K8s 版本 注意 4 etcd 备份与恢复 5 网络策略 查看官网 NetworkPolicy 6 SVC 暴露应用 7 Ingress 查看官网 ingress 8
  • unix环境高级编程——进程间通信之管道

    本期主题 unix环境高级编程 进程间通信之管道 管道 1 什么是管道 1 定义 2 管道的局限性 2 进程管道 1 popen和pclose 2 使用popen的弊端 3 pipe函数 1 单进程管道通信 2 跨越fork调用的管道 4
  • 数字证书简介

    1 为什么 在说清楚数字证书是什么之前 先要搞清楚为什么要有数字证书 或者说数字证书的出现是为了解决什么问题 请看以下通信流程 1 1 使用数字签名技术防止信息伪造 1 1 1 发送明文信息 小灰灰给懒羊羊发了一条信息 约懒羊羊去玩 1 1
  • 自行获取区域经纬度的工具

    摘要 上一章教大家如何建立自己的行政区域地图 这次为大家提供一个 可视化选择区域 并且能自动生成经纬度代码的工具 工具的源代码完全公开 并且做了详尽的注释 可以单纯做为一个工具 也可做为百度地图API的学习案例 工具说明 1 开关可以控制
  • substring的常用两个方法

    概述 1 substring是用来截取字符串的 根据参数的个数不同 方法含义也不同 2 substring 0 2 这个只含开头不含结尾 因此截取是截取两个字符 从第一个到第二个字符 不包含第三个 3 substring 2 这个表示截掉前
  • javaweb-30:smbms项目搭建

    SMBMS 数据库 sql脚本 通过sqlyog图形化界面操作 在历史记录中对应相应的sql 表的引擎默认为InnoDB 字符集和核对默认和数据库一致 CREATE DATABASE smbms CHARACTER SET utf8 COL
  • java堆外内存泄漏分析排查

    JAVA堆外内存分析 文章目录 JAVA堆外内存分析 1 前言 2 准备 3 具体分析 3 1堆外溢出风险判断 3 1 1确认java进程号 3 1 2查看此java进程的jvm参数 3 1 3查看java进程的大概内存占用情况 3 1 4
  • bug: tab 标签页界面切换导致echarts图表默认宽度100px的问题

    bug tab 标签页界面切换导致echarts图表默认宽度100px的问题 最近在bootstrap中使用echarts 本来在一个页面显示全部图表时是正常的 后面使用tab标签页界面切换不同表格时碰到的一个echarts bug tab
  • 【CSDN开发云】光速认识Cloud IDE

    个人格言 时间是亳不留情的 它真使人在自己制造的镜子里照见自己的真相 Git专栏 Git篇 你的一键三连是对我的最大支持 CSDN最新产品 云IDE 来啦 云IDE 将为各位技术er一键秒级构建云开发环境 提升开发效率 为持续提升产品体验
  • javaScript数组方法记录——持续补充

    javaScript数组方法记录 将平时用到的或者可能用到的记录一下 有助于加深记忆 查找起来也方便 concat concat 方法用于 连接 两个或者多个 数组 会返回合并数组之后的数据 不会改变原来的数组 let a 张三 李四 赵五
  • DC基础学习(五)Verilog语言结构到门级的映射1

    Design Compiler 以下简称DC 是Synopsys公司用于做电路综合的核心工具 可以将HDL描述的电路转换为基于工艺库的门级网表 本系列主要介绍综合相关的知识以及DC工具的使用 Verilog编码效率的高低是综合后电路性能高低
  • 「Python 基础」网络编程、电子邮件

    文章目录 1 网络编程 TCP IP TCP 编程 服务端 客户端 UDP 编程 服务端 客户端 2 电子邮件 SMTP 发送邮件 POP3 收取邮件 1 网络编程 网络通信就是两个进程之间的通信 TCP IP IP 地址 计算机的网络接口
  • Nginx入门和反向代理

    文章目录 1 Nginx简介 2 Nginx在Linux上安装 2 1先去 nginx官网 http nginx org en download html 下载压缩包 2 2把压缩包上传到Linux中 2 3 安装依赖环境 2 4 解压 需
  • 一个Python示例,它演示了如何定义一个函数,计算两个数字的乘积

    一个Python示例 它演示了如何定义一个函数 计算两个数字的乘积 定义一个函数 计算两个数字的乘积 def multiply x y return x y 调用函数 并将结果存储在变量中 result multiply 5 10 输出函数
  • shell脚本实现C程序日志分流和多Terminal显示

    日志打印是软件必需的功能 通常C程序会将所有运行日志输出到指定LOG 一 有时候需要在C程序运行期间查看实时日志 最好地 可以根据关键字筛选自己想要查看的内容 二 有时候 希望另开Terminal去查看日志 而不是使用当前的Terminal