解析输出并计算字符串出现的次数[关闭]

2023-12-12

我正在运行一些代码。由于复杂性和篇幅,我想也许可以使用一些代码来让我的生活变得轻松。所以代码运行时使用>commandA

output
results
are
popping
...
here

I want to count the number of times banana appears in the output of commandA (which is running) and when the count is 10, I want to stop the processing (using CTRL+Z) and

echo "************we reached 10**********************"

并重新开始。

我正在unix系统上用perl编写代码。

编辑:我不能在这里使用 grep 函数,因为命令已经运行。或者将运行但没有 grep 函数。在命令运行之前,我将打开程序以查找终端输出中的特定单词。现在使用 grep 会很容易,但我不知道 perl 中的哪个函数实际上将输出作为 stdin 接收到终端


您可以通过以下方式启动其他程序open从它到 Perl 程序的管道,然后逐行读取其输出,直到达到终止条件:

open my $pipe, 'commandA |'
    or die "Error opening pipe from commandA: $!\n";

my $n = 0;
while (<$pipe>) {
    $n++ if /banana/;
    last if $n >= 10;
}
close $pipe;  # kills the command with SIGPIPE if it's not done yet

print "commandA printed 'banana' ", ($n >= 10 ? "at least 10" : $n), " times.\n";

不过,这里有几个陷阱需要注意。一是关闭管道只会在另一个程序下次尝试打印内容时杀死该程序。如果另一个程序可能运行很长时间而不生成任何输出,您可能需要kill明确地。

为此,您需要知道它的进程 ID,但是,为了方便起见,这正是open当您打开管道时返回。但是,您可能想使用多参数版本open,这样返回的 PID 将是实际 commandA 进程的 PID,而不是用于启动它的 shell 的 PID:

my $pid = open my $pipe, '-|', 'commandA', @args
    or die "Error opening pipe from commandA: $!\n";

# ...
kill 'INT', $pid;  # make sure the process dies
close $pipe;

另一个陷阱是输出缓冲。大多数程序实际上并不将其输出直接发送到输出流,而是对其进行缓冲,直到积累了足够的输出或直到缓冲区被显式刷新。您通常不会注意到这一点的原因是,默认情况下,许多程序(包括 Perl)将在每个输出行的末尾刷新其输出缓冲区(即每当\n已打印)if它们检测到输出流进入交互式终端(即 tty)。

但是,当您将一个程序的输出通过管道传输到另一个程序时,第一个程序使用的 I/O 库可能会注意到输出进入管道而不是 tty,并且可能启用更积极的输出缓冲。通常这不会成为问题,但在某些有问题的情况下,它可能会在其他程序打印字符串的时间与您的程序接收字符串的时间之间增加相当大的延迟。

不幸的是,如果您无法修改其他程序,则对此您无能为力。它is可以用称为“伪tty”的东西替换管道,它看起来像其他命令的交互式终端,但这有点复杂。不过,有一个 CPAN 模块可以稍微简化它,称为IO::Pty.

(If you can修改其他程序,就容易多了。例如,如果它是另一个 Perl 脚本,您只需添加$| = 1;在脚本的开头以启用输出自动刷新。)

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

解析输出并计算字符串出现的次数[关闭] 的相关文章

随机推荐

  • R Leaflet 离线地图图块未加载

    我需要帮助尝试找出为什么使用本地保存的地图图块的传单地图无法正常工作 我正在尝试重新创建示例here根据本地保存的地图图块创建传单地图 但是 当我创建它时 背景地图图块不会加载 我的代码基本上直接来自示例 但针对我的目录进行了更新 并更新以
  • Objective-C 构建中出现重复符号错误?

    当我按构建 调试时出现此错误 ld duplicate symbol objc class name BlogTableItemCell in Users fabian Development Workspaces iphone exper
  • 在 TBIMP 编辑的 dll 之后手动生成 ActiveX 包装器?

    我有几个需要从 C 项目访问的 ActiveX 组件 我可以通过 Visual Studio 的添加引用对话框导入它们 该对话框还将自动生成包装类 IE ABCLib and AxABCLib 我知道我可以通过运行手动生成主互操作程序集TL
  • C#:如何使用 IReadOnly 字典实现接口,其中包含来自包含具体值的具体字典的接口值

    在我的代码中 我声明内部类和公共接口 并且有一种情况 我想公开一个带有包含接口类型值的 IReadonlyDictionary 的接口 但我想用具有带有值的 Dictionary 的类来实现它具体类型 我需要这个 因为我正在将一些 JSON
  • 迁移到 Team Foundation Server

    我们有一台安装了 TFS 的新服务器 当前的环境非常平常 源代码使用SourceSafe 2005 进行管理 并与Visual Studio 2008 企业版集成 QA 团队正在使用 Bugzilla 来报告错误 首先是一些基本问题 我怎样
  • 使用 softmax 激活的二元分类始终输出 1

    对于问题的质量感到抱歉 但这里是初学者 我只是想用泰坦尼克号数据集试试运气 但它总是预测乘客死亡 我尝试解释下面的代码 import matplotlib pyplot as plt import numpy as np import pa
  • 如何在同一个类的另一个方法中调用一个方法的变量

    我正在尝试访问同一类的另一个方法中的方法的变量 但由于某种原因它什么也不打印 class Colors def blue self var This is blue def red self b self blue print b var
  • 来自非嵌套/同级目录的 Mercurial 子存​​储库?

    是否可以使用同级路径创建子存储库 Subversion 是我们 选择的 版本控制系统 但我已经遇到了一些过时提交的问题 对我来说 在 Hg 和 SVN 下双重版本我的文件要方便得多 而且我已经取得了巨大的成功 然而 我还有其他一些同事使用汞
  • CUDA:将相同的内存位置流式传输到所有线程

    这是我的问题 我有相当大的双精度数集 它是一个包含 77 500 个双精度数的数组 要存储在 cuda 中的某个位置 现在 我需要一大堆线程来顺序地对该数组执行一系列操作 每个线程都必须读取该数组的相同元素 执行任务 将结果存储在共享内存中
  • Android 打瞌睡模式和前台服务

    我在这里读到了很多关于打瞌睡模式的问题 比如安卓打瞌睡模式 Android N Doze 模式 如何保持后台下载和处理 唤醒和打瞌睡模式还有许多其他人 但在很多回复中 意见不一 我自己无法测试 模拟器不支持我的处理器 我唯一的测试设备是an
  • 可变参数宏中标记的串联

    在 C 中 是否可以将可变参数连接到可变参数宏中 例子 MY MACRO A B C will yield HDR A HDR B HDR C MY MACRO X Y will yield HDR X HDR Y 正常的 运算符对于可变参
  • XPath 测试节点值是否为数字

    如何使用 XPath 检查节点值是否为数字 有任何想法吗 测试该值NaN
  • 如何通过 Ecto Multi 从先前插入的表键中检索 id

    我想从之前由 Ecto Multi 插入的表主键中检索 id 首先 我插入到A主表中 那么B明细表需要A id 我尝试了以下代码 Multi new gt Multi insert insert main gt Multi insert a
  • 如何发送 HTML/CSS 电子邮件?

    大多数电子邮件客户端在读取 HTML 电子邮件 包括 Gmail 和 Hotmail 中的 CSS 时遇到问题 我经常使用此服务将 HTML CSS 转换为正确的电子邮件格式 以便用户端的一切看起来都正常 基本上它的作用是将所有 CSS 转
  • 在 JavaScript 中调用 MATLAB

    我是 JavaScript 新手 正在使用 JavaScript 编写一个简单的网页游戏来进行研究 人们可以玩游戏并收集一些数据 收集到的数据需要经过MATLAB处理 并将结果返回给JavaScript代码 JavaScript 代码将在客
  • std::promise::set_value() 和 std::future::wait() 是否提供内存栅栏?

    如果我执行以下操作 std promise
  • 函数中的 SELECT 或 INSERT 是否容易出现竞争条件?

    我编写了一个函数来为简单的博客引擎创建帖子 CREATE FUNCTION CreatePost VARCHAR TEXT VARCHAR RETURNS INTEGER AS DECLARE InsertedPostId INTEGER
  • javascript匿名函数[重复]

    这个问题在这里已经有答案了 可能的重复 这个 JavaScript 片段是什么意思 我想知道为什么函数末尾有双括号 这是匿名函数的简单说明 function 功能 那些是做什么用的 这声明了一个匿名函数并在同一行立即调用它 将其视为 foo
  • 为单个图像创建多个蒙版

    我正在尝试创建以下场景 并且我愿意使用 jquery css 和 html 的任意组合 不过我现在想远离 HTML 5 但我愿意看看它如果这是唯一的解决方案 我想要一张大图像 只能在蒙版所在的位置可见 我尝试了多种技术 但都不起作用 任何建
  • 解析输出并计算字符串出现的次数[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在运行一些代码 由于复杂性和篇幅 我想也许可以使用一些代码来让我的生活变得轻松 所以代码运行时使用 gt commandA output results are popping