我需要从命令的输出中提取一个数字:cmd。输出为type: 1000。所以我的问题是如何执行命令,将其输出存储在变量中,并在shell脚本中提取1000。另外,如何将提取的字符串存储在变量中?
您将您的问题标记为sed,但您的问题描述并不限制其他工具,因此这里有一个使用awk的解决方案。
output = `cmd | awk -F':' '/type: [0-9]+/{print $2}'`
或者,您可以使用更新的$( )语法。有些人认为较新的语法更可取,并且可以方便地嵌套,而不需要转义backtics。
output = $(cmd | awk -F':' '/type: [0-9]+/{print $2}')
类型:1000只是输出的多行中的一行。所以我想我要匹配精确的模式,然后提取它后面的字符串。谢谢。
@JFreebird,请参见更新。
知道了。谢谢。
为什么不只用awk呢?cmd | awk '/type : [0-9]+/ {print $3;exit}。不需要grep,尤其是egrep。不过,我还是会用sed。
@Hek2mgl,好观点,编辑。
你不应该使用旧的和过时的反勾号,使用括号$(code),就像这个output=$(cmd | awk -F':' '/type: [0-9]+/{print $2}')。
@乔特纳的作品没有提到他使用的是哪一种外壳,我相信旧的风格是更便于携带跨越外壳。如果我弄错了请改正。
据我所知,以及其他人所写的,你需要一个非常古老和晦涩的系统来没有括号。如果您有疑问,请同时发布这两个消息,并说最好使用括号。(用谷歌搜索)
@Jotne,我已经更新了它,将两者都包括在内,但是请注意,这里接受的答案中的链接并没有说一个被否决而另一个被否决。
这个问题以前曾在这里被分块回答过,应该是这样的:
line=$(sed -n '2p' myfile)
echo"$line"
if [ `echo $line || grep 'type: 1000' ` ] then;
echo"It's there!";
fi;
将SED的输出存储到变量中
bash中包含的字符串
编辑:SED非常有限,您需要使用bash、perl或awk来满足您的需要。
这是grep的典型用例:
output=$(cmd | grep -o '[0-9]\+')
您可以使用所谓的命令替换将命令的输出甚至命令管道写入shell变量:
variable=$(cmd);
在评论中,似乎cmd的输出比type : 1000包含更多的行。在这种情况下,我建议sed:
output=$(cmd | sed -n 's/type : \([0-9]\+\)/\1/p;q')
类型:1000只是输出的多行中的一行。所以我想匹配准确的模式,然后提取后面的字符串。谢谢。
啊,好吧…那我就用sed…给我一秒钟。顺便说一句,你看没人知道这个细节。你应该加强你的问题。
好吧,我得知道怎么处理伤口。不管怎样,谢谢你
????对不起,这让0有意义!如何切割处理输出中的多条线?你接受并支持最坏的答案
下面是一个简单的SED解决方案,它使用Regular表达式查找字符串中的数字:
cmd | sed 's/^.*type: \([0-9]\+\)/\1/g'
^表示从一开始
.*可以是任何字符(也可以是无字符)
\([0-9]\+\)是数字(至少一个字符)
\1表示它采用它找到的第一个模式(并且仅在本例中),并将其用作整个字符串的替换。
如果输出严格限制在"类型:"后面跟一个数字,则只能使用cut。
var=$(echo 'type: 1000' | cut -f 2 -d ' ')
显然,您必须将命令的输出通过管道传输到cut,我使用echo作为演示。
另外,如果您搜索的字符串更复杂,我会使用grep,然后使用cut。如果我们假设文本中可以有所有类型的数字,但只有一个出现的"类型:"后跟一个数字,则可以使用以下命令:
>> var=$(echo"hello 12 type: 1000 foo 1001" | grep -oE"type: [0-9]+" | cut -f 2 -d ' ')
>> echo $var
1000
明白你的意思。谢谢。
可以使用运算符将一个命令的输出发送到另一个命令,如下所示:
echo" 1
2
3
" | grep"2"
这会将字符串"1 2 3"发送到grep命令,该命令将搜索包含2的行。听起来你可能想做如下的事情:
cmd | grep"type"