如何使用sed提取字符串

时间:2014-06-30 23:19:07

标签: shell sed

我需要从命令的输出中提取一个数字:cmd。输出为type: 1000 所以我的问题是如何执行命令,将其输出存储在变量中并在shell脚本中提取1000。另外,如何将提取的字符串存储在变量中?

6 个答案:

答案 0 :(得分:2)

您已将问题标记为sed,但您的问题说明并未限制其他工具,因此这是使用awk的解决方案。

output = `cmd | awk -F':' '/type: [0-9]+/{print $2}'`

或者,您可以使用较新的$( )语法。有些人发现较新的语法更为可取,并且可以方便地嵌套,而无需转义背景。

output = $(cmd | awk -F':' '/type: [0-9]+/{print $2}')

答案 1 :(得分:1)

这是grep的典型用例:

output=$(cmd | grep -o '[0-9]\+')

您可以使用所谓的command substitution将命令的输出甚至命令管道写入shell变量:

variable=$(cmd);

在评论中,似乎cmd的输出包含的行数多于type : 1000。在这种情况下,我建议sed

output=$(cmd | sed -n 's/type : \([0-9]\+\)/\1/p;q')

答案 2 :(得分:1)

这个问题之前已在这里得到解答,它会是这样的:

line=$(sed -n '2p' myfile)
echo "$line"


if [ `echo $line || grep 'type: 1000' ` ] then;
  echo "It's there!";
fi;

Store output of sed into a variable

String contains in Bash

编辑:sed非常有限,你需要使用bash,perl或awk来满足你的需要。

答案 3 :(得分:0)

您可以使用| operator将一个命令的输出发送给另一个命令,如下所示:

echo " 1\n 2\n 3\n" | grep "2"

这会将字符串“1 \ n 2 \ n 3 \ n”发送到grep命令,该命令将搜索包含2的行。听起来您可能想要执行以下操作:

cmd | grep "type"

答案 4 :(得分:0)

如果输出严格限制为“type:”后跟数字,则可以使用cut

var=$(echo 'type: 1000' | cut -f 2 -d ' ')

显然,您必须将命令的输出传递给cut,我正在使用echo作为演示。

此外,如果您要搜索的字符串更复杂,我会使用grep然后使用cut。如果我们假设文本中可以有所有类型的数字,但只有一次出现“type:”后跟一个数字,则可以使用以下命令:

>> var=$(echo "hello 12 type: 1000 foo 1001" | grep -oE "type: [0-9]+" | cut -f 2 -d ' ')
>> echo $var
1000

答案 5 :(得分:0)

这是一个简单的sed解决方案,它使用一个regualar表达式来查找字符串中的数字:

cmd | sed 's/^.*type: \([0-9]\+\)/\1/g'
  • ^从一开始就意味着
  • .*可以是任何字符(也都是无)
  • \([0-9]\+\)是数字(最少一个字符)
  • \1表示它找到它找到的第一个模式(仅在这种情况下)并将其用作整个字符串的替换