相当于perl中的shell脚本的grep命令

时间:2014-06-25 11:02:50

标签: perl

我在shell脚本中使用了以下语法 -

imp_vol -u $undr_price -s $str_price -p $price -t $mat -c $iscall | grep "Black Scholes " | cut-d"=" -f2

其中imp_vol是可执行文件,可以打印某些内容。在Perl脚本中它的等价物是什么?例如:

imp_vol -u 110.5 -s 110.9 -p 0.005 -t 0.041 -c 1
    Underlying Price = 110.5
    Strike Price = 110.9
    Price = 0.005
    Time = 0.041
    IsCall = 1
    Black Scholes Vol = 0.0108141

所以我的目的是在这种情况下将Black Scholes Vol的值设置为某个变量中的`.0108141,因为我必须再次在某个函数中传递该变量。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

perl中实际上有一个grep函数。它将表达式或块作为第一个参数,将字符串列表作为第二个参数。所以你可以这样做:

my @list = grep(/abcd/, (<>));

另请参阅:grep - perldoc.perl.org

在您的具体情况下,您可以使用块表单来提取价格:

imp_vol | perl -e 'print grep { s/\s+Black Scholes Vol = ([-+]?[0-9]*\.?[0-9]+)/$1/ } (<>)'

答案 1 :(得分:1)

如果您希望所有“Black Scholes”与您的grep匹配

imp_vol -u $undr_price -s $str_price -p $price -t $mat -c $iscall | perl -ne 'print $1 if $_ =~ /Black Scholes .* = (\d+(?:\.\d+)?)/;'

“Black Scholes Vol”正好

| perl -ne 'print $1 if $_ =~ /Black Scholes Vol = (\d+(?:\.\d+)?)/;'

答案 2 :(得分:0)

使用Regexes

while (<>) {
    next if !/abcd/;
    # ...
}

另外,要替换剪切,请使用capture groups,但我无法提供更多代码,因为我不知道您的数据格式。

答案 3 :(得分:0)

要执行该命令,您可以使用open获取一个文件句柄,您可以从中读取其输出。然后,您可以使用单个正则表达式匹配该行并提取该值。例如:

my $cmd = "imp_vol -u $undr_price -s $str_price -p $price -t $mat -c $iscall";
open (my $imp, '-|', $cmd) or die "Couldn't execute command: $!";

my $extracted;
while (<$imp>) {
    if (/Black Scholes Vol = (.*)/) {
        $extracted = $1;
    }
}
close $imp;

括号创建capture group,将值提取到特殊$1变量中。

如果你能够管道输入而不必在Perl中执行命令,那么下面的单行就足够了:

imp_vol ... | perl -ne 'print $1 if /Black Scholes Vol = (.*)/'