剥离管道输出的第一部分

时间:2013-03-15 17:31:01

标签: bash sed

我有一个输出以下内容的bash脚本:

SUM = 137892134.0000000

我需要去除字符串的第一部分,只留下数字,如果可能的话,格式化为整数。我假设我需要使用sed,但我似乎没有能力学习它。

我需要能够编写一个条件语句,如果值小于100就可以运行。我不知道我是否可以在bash脚本中执行此操作,但这将是我挑战的第二部分。

4 个答案:

答案 0 :(得分:2)

sed替换的基本形式是:

s/replace this/with this/

“替换此”和“与此”都是正则表达式。在您的情况下,您希望完全摆脱开头的文字字符串“SUM =”和结尾的小数。所以:

#!/bin/bash
sum=$(your_script.sh | sed 's/^SUM = //' | sed 's/\..*//')
if ! egrep -q '^[0-9]+$' <<< $sum; then
    echo "your_script.sh printed unexpected output!"
    exit 1
fi
if [ $sum -lt 100 ]; then
    echo "$sum is less than 100"
else
    echo "$sum is not less than 100"
fi

第一行是将“SUM = 137892134.0000000”变成“137892134”。第一个sed在字符串(^)的开头替换“SUM =”,没有任何东西(即删除它)。第二个sed找到第一个句点字符(\.)并将其替换为它后面的所有内容(.*)。然后,使用$sum将结果字符串保存到变量$(...)

使用egrep的if语句正在检查以确保我们在$sum中保存的值实际上是一个整数,如果不是则保释。

第二个if语句将$ sum的值(我们现在知道它是一个整数)与100进行比较。

答案 1 :(得分:2)

我不清楚你想如何处理“123.789”(打印为整数时是否打印124或123)。考虑:

if $( echo SUM = 137892134.0000000 | awk '{printf "%d", $3}' ) -lt 100; then
   echo the value is less than 100!!
fi

你也可以这样做:

if echo SUM = 137892134.0000000 | awk '$3 >= 100 { exit 1}'; then
    echo the value is less than 100!!
fi

if ! echo SUM = 137892134.0000000 | awk '{exit $3 < 100}'; then
     echo the value is less than 100!!
fi

请注意,逻辑有点复杂,因为awk返回1计算为失败,因此比较运算符与预期的相反。

答案 2 :(得分:1)

以下是使用sed执行此操作的一种方法:

echo 'SUM = 137892134.0000000' | sed 's/[^0-9.]//g' | sed 's/\..*//g'

这就是输出的样子:137892134

对命令的一些解释:

  • sed 's/[^0-9.]//g'告诉sed删除任何不是数字的字符(0 - 9)或句点(.

  • sed 's/\..*//g'告诉sed删除小数点后的任何字符(.*)(\.

  • 此外,您可以将原始脚本的输出用于第一部分,而不是使用echo ...然后可以将其传送到sed以最终获得最终结果你想要的“int”。

注意:这不会考虑William Pursell提出的任何舍入问题

答案 3 :(得分:0)

我建议:

bashScript | sed 's/.* \(.*\)\.0*/\1/'

在英语中:“取一堆东西后跟一个空格,然后是某些东西,然后是一个点,也许是一些零,并用替换所有这些“。