【发布时间】:2014-08-21 10:14:46
【问题描述】:
我需要从命令的输出中提取一个数字:cmd。输出为type: 1000
所以我的问题是如何执行命令,将其输出存储在变量中并在 shell 脚本中提取 1000。另外,如何将提取的字符串存储在变量中?
【问题讨论】:
我需要从命令的输出中提取一个数字:cmd。输出为type: 1000
所以我的问题是如何执行命令,将其输出存储在变量中并在 shell 脚本中提取 1000。另外,如何将提取的字符串存储在变量中?
【问题讨论】:
这是一个简单的 sed 解决方案,它使用正则表达式来查找字符串中的数字:
cmd | sed 's/^.*type: \([0-9]\+\)/\1/g'
^ 表示从头开始.* 可以是任何字符(也没有)\([0-9]\+\) 是数字(至少一个字符)\1 表示它采用它找到的第一个模式(并且仅在这种情况下)并将其用作整个字符串的替换【讨论】:
您将您的问题标记为sed,但您的问题描述不限制其他工具,因此这里有一个使用awk 的解决方案。
output = `cmd | awk -F':' '/type: [0-9]+/{print $2}'`
或者,您可以使用较新的$( ) 语法。有些人发现新语法更可取,它可以方便地嵌套,而无需转义反引号。
output = $(cmd | awk -F':' '/type: [0-9]+/{print $2}')
【讨论】:
awk? cmd | awk '/type : [0-9]+/ {print $3;exit}。 grep 尤其是 egrep 不是必需的。但是,我仍然会使用sed
$(code)就像这样output=$(cmd | awk -F':' '/type: [0-9]+/{print $2}')
这是grep 的典型用例:
output=$(cmd | grep -o '[0-9]\+')
您可以使用所谓的command substitution 将命令的输出甚至命令管道写入 shell 变量:
variable=$(cmd);
在 cmets 中,cmd 的输出似乎比type : 1000 包含更多的行。在这种情况下,我建议sed:
output=$(cmd | sed -n 's/type : \([0-9]\+\)/\1/p;q')
【讨论】:
sed...给我一秒钟。顺便说一句,你看没有人得到这个细节。你应该加强你的问题。
0 有意义! cut 如何处理输出中的多行?您实际上是在接受和支持最糟糕的答案
如果输出严格限制为 "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
【讨论】:
您可以使用 |运算符将一个命令的输出发送到另一个命令,如下所示:
echo " 1\n 2\n 3\n" | grep "2"
这会将字符串“1\n 2\n 3\n”发送到 grep 命令,该命令将搜索包含 2 的行。听起来您可能想要执行以下操作:
cmd | grep "type"
【讨论】:
这个问题之前已经在这里分块回答过,大概是这样的:
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
编辑:sed 非常有限,您需要使用 bash、perl 或 awk 来满足您的需要。
【讨论】: