1

我有一个程序,当我运行时,它会在命令行中打印如下内容:

file test.test: 427 sentences, 2433 words, 1186 OOVs
0 zeroprobs, logprob= -4914.55 ppl= 862.603 ppl1= 8731.65

但我只想将数字 862.603 保存在环境变量中。如何从程序的输出中提取该单个数字?

4

5 回答 5

3

到目前为止我看到的每个答案都有一些不足,所以我想我会继续添加这个:

有几种方法可以做到这一点。

我首选的方法是使用 grep 的 perl 扩展 ( -P):

var=$(myProgram | grep -oP 'ppl=\s*\K\d+\.\d+')

-o标志告诉 grep 只打印匹配的字符串,在这种情况下就是您要查找的数字。

请注意,这(几乎)与 sputnick 的解决方案相同,但我已将其调整为直接通过管道而不是从文件中读取您的程序。

我更喜欢这种解决方案,因为您本质上是想搜索 grep 擅长的特定字符串。唯一的问题是您还想做一个lookbehind,这仅在 perl regex 扩展中受支持。

所以,如果你的 grep 不支持 perl 正则表达式扩展,我会使用 sed:

var=$(myProgram | sed 's/ppl=\s*\(\d\+\.\d\+\)/\1/')

这假设 gnu sed,这很常见。如果您没有 gnu sed,请使用以下命令:

var=$(myProgram | sed 's/ppl=[ \t]*\([0-9]\{1,\}\.[0-9]\{1,\})/\1/')

这里的底线是,您绝对不需要多个管道来完成这项任务。打开管道意味着开始新的流程,这很昂贵。通常,在 shell 中编码时,您希望打开尽可能少的管道来完成您的任务。


编辑

只是要指出:如果您有可用的 perl 扩展,sputnick 的答案现在几乎正是您想要的。现在他和我之间的唯一区别是一个小的正则表达式更改(无论如何,您最终可能不得不调整自己以满足您的需求)。

于 2012-06-03T20:59:49.580 回答
2
$ var=$(<YOUR_COMMAND> | grep -oP "ppl= \K\d+\.\d+")
$ echo $var
862.603

如果您的发行版缺少该grep -P选项,则应安装pcregrep

编辑:帖子编辑以更好地满足您的需求:我在文件上使用 grep,现在这是您的命令。

Edit2:这是一种awk方法:

var=$(
    <YOUR_COMMAND> |
        awk '
            /ppl=/{
                for (i=0; i<NF; i++) {
                    if ($(i) ~ "ppl=" && $(i) > 1) {
                        print $(i+1)
                    }
                }
            }'
        )
echo $var
于 2012-06-03T20:03:24.550 回答
0

试试这个:

var=`./program | grep 'ppl=' | cut -d= -f3 | sed 's/ //g' | sed 's/ppl1//g'`
于 2012-06-03T20:05:43.390 回答
0

$ MY_ENV_VAR="$(myprogram |grep 'ppl= '|sed -r 's:^.*ppl= ([0-9\.]+).*:\1:')"

于 2012-06-03T19:56:17.440 回答
0

You could use fgrep to get only the line you want, and awk to get only the number you want:

program | fgrep ppl= | awk '{ print $6 }'
于 2012-06-03T20:00:36.173 回答