当前位置:  开发笔记 > 编程语言 > 正文

如何在循环中运行命令,直到我在stdout中看到一些字符串?

如何解决《如何在循环中运行命令,直到我在stdout中看到一些字符串?》经验,为你挑选了4个好方法。

我确定有一些带有perl,ruby,bash的简单单线程,无论是什么让我在循环中运行命令,直到我在stdout中观察到一些字符串,然后停止.理想情况下,我也想捕获stdout,但如果要进入控制台,这可能就足够了.

目前所讨论的特定环境是RedHat Linux,但有时在Mac上也需要同样的东西.所以,通用和*nixy是最好的.不关心Windows - 大概是一个*nixy的东西可以在cygwin下工作.

更新:请注意,通过"观察一些字符串"我的意思是"stdout包含一些字符串"而不是"stdout IS some string".



1> Derek Park..:

在Perl中:

#!/usr/local/bin/perl -w

if (@ARGV != 2)
{
    print "Usage: watchit.pl  \n";
    exit(1);
}

$cmd = $ARGV[0];
$str = $ARGV[1];

while (1)
{
    my $output = `$cmd`;
    print $output; # or dump to file if desired
    if ($output =~ /$str/)
    {
        exit(0);
    }
}

例:

[bash$] ./watchit.pl ls stop
watchit.pl
watchit.pl~
watchit.pl
watchit.pl~
... # from another terminal type "touch stop"
stop 
watchit.pl
watchit.pl~

不过,你可能想在那里添加一个睡眠.



2> Jay..:

有很多方法可以做到这一点,首先想到的是:

OUTPUT=""; 
while [ `echo $OUTPUT | grep -c somestring` = 0 ]; do 
  OUTPUT=`$cmd`; 
done

$ cmd是您执行的命令.

对于它来说,这是一个BASH函数版本,所以你可以更容易地调用它,如果它是你想要定期从交互式shell调用的东西:

function run_until () {
  OUTPUT="";
  while [ `echo $OUTPUT | grep -c $2` = 0 ]; do
    OUTPUT=`$1`;
    echo $OUTPUT;
  done
}

免责声明:只有经过轻微测试,如果您的命令有很多参数或字符串包含特殊字符,可能需要进行一些额外的转义等.

编辑:基于亚当的意见反馈-如果你没有需要任何理由输出(即不希望显示输出),那么你可以使用这个较短的版本,与反引号的使用较少,因此较少的开销:

OUTPUT=0; 
while [ "$OUTPUT" = 0 ]; do 
  OUTPUT=`$cmd | grep -c somestring`;
done

BASH功能版还:

function run_until () {
  OUTPUT=0; 
  while [ "$OUTPUT" = 0 ]; do 
    OUTPUT=`$1 | grep -c $2`; 
  done
}



3> markets..:

我很惊讶我没有看到这里提到的简短的Perl单行程序:

perl -e 'do { sleep(1); $_ = `command`; print $_; } until (m/search/);'

对于像这样的东西,Perl是一个非常好的语言.将"command"替换为要重复运行的命令.将"搜索"替换为您要搜索的内容.如果你想搜索带有斜杠的东西,那么m/search/m#search字符串替换为/es#.

此外,Perl在许多不同的平台上运行,包括Win32,这将适用于Perl安装的任何地方.只需适当更改命令即可.



4> ordnungswidr..:

grep -c 99999 将打印99999行的上下文(我认为这就足够了):

while true; do /some/command | grep expected -C 99999 && break; done

要么

until /some/command | grep expected -C 9999; do echo -n .; done

...这将打印一些漂亮的点来表示进展.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有