我有一个程序,当我运行时,它会在命令行中打印如下内容:
file test.test: 427 sentences, 2433 words, 1186 OOVs
0 zeroprobs, logprob= -4914.55 ppl= 862.603 ppl1= 8731.65
但我只想将数字 862.603 保存在环境变量中。如何从程序的输出中提取该单个数字?
到目前为止我看到的每个答案都有一些不足,所以我想我会继续添加这个:
有几种方法可以做到这一点。
我首选的方法是使用 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 的答案现在几乎正是您想要的。现在他和我之间的唯一区别是一个小的正则表达式更改(无论如何,您最终可能不得不调整自己以满足您的需求)。
$ 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
试试这个:
var=`./program | grep 'ppl=' | cut -d= -f3 | sed 's/ //g' | sed 's/ppl1//g'`
$ MY_ENV_VAR="$(myprogram |grep 'ppl= '|sed -r 's:^.*ppl= ([0-9\.]+).*:\1:'
)"
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 }'