Shell 如何使用sed提取字符串
我需要从命令的输出中提取一个数字:Shell 如何使用sed提取字符串,shell,sed,Shell,Sed,我需要从命令的输出中提取一个数字:cmd。输出为类型:1000 所以我的问题是如何执行命令,将其输出存储在变量中,并在shell脚本中提取1000。另外,如何将提取的字符串存储在变量中?您将问题标记为sed,但您的问题描述并不限制其他工具,因此这里有一个使用awk的解决方案 output = `cmd | awk -F':' '/type: [0-9]+/{print $2}'` 或者,您可以使用较新的$()语法。有些人认为较新的语法更可取,并且可以方便地嵌套,而无需转义backtics ou
cmd
。输出为类型:1000
所以我的问题是如何执行命令,将其输出存储在变量中,并在shell脚本中提取1000。另外,如何将提取的字符串存储在变量中?您将问题标记为
sed
,但您的问题描述并不限制其他工具,因此这里有一个使用awk
的解决方案
output = `cmd | awk -F':' '/type: [0-9]+/{print $2}'`
或者,您可以使用较新的$()
语法。有些人认为较新的语法更可取,并且可以方便地嵌套,而无需转义backtics
output = $(cmd | awk -F':' '/type: [0-9]+/{print $2}')
您将问题标记为
sed
,但您的问题描述并不限制其他工具,因此这里有一个使用awk
的解决方案
output = `cmd | awk -F':' '/type: [0-9]+/{print $2}'`
或者,您可以使用较新的$()
语法。有些人认为较新的语法更可取,并且可以方便地嵌套,而无需转义backtics
output = $(cmd | awk -F':' '/type: [0-9]+/{print $2}')
这是
grep
的典型用例:
output=$(cmd | grep -o '[0-9]\+')
您可以使用以下命令将命令输出或命令管道写入shell变量:
在注释中,
cmd
的输出似乎比type:1000
包含更多的行。在这种情况下,我建议sed
:
output=$(cmd | sed -n 's/type : \([0-9]\+\)/\1/p;q')
这是
grep
的典型用例:
output=$(cmd | grep -o '[0-9]\+')
您可以使用以下命令将命令输出或命令管道写入shell变量:
在注释中,
cmd
的输出似乎比type:1000
包含更多的行。在这种情况下,我建议sed
:
output=$(cmd | sed -n 's/type : \([0-9]\+\)/\1/p;q')
这个问题在这里已经被分块回答过了,应该是这样的:
line=$(sed -n '2p' myfile)
echo "$line"
if [ `echo $line || grep 'type: 1000' ` ] then;
echo "It's there!";
fi;
编辑:sed非常有限,您需要使用bash、perl或awk来满足您的需要 这个问题以前在这里已经被分块回答过了,应该是这样的:
line=$(sed -n '2p' myfile)
echo "$line"
if [ `echo $line || grep 'type: 1000' ` ] then;
echo "It's there!";
fi;
编辑:sed非常有限,您需要使用bash、perl或awk来满足您的需要 您可以使用|运算符将一个命令的输出发送到另一个命令,如下所示:
echo " 1\n 2\n 3\n" | grep "2"
这会将字符串“1\n2\n3\n”发送到grep命令,该命令将搜索包含2的行。听起来您可能想做以下事情:
cmd | grep "type"
您可以使用|运算符将一个命令的输出发送到另一个命令,如下所示:
echo " 1\n 2\n 3\n" | grep "2"
这会将字符串“1\n2\n3\n”发送到grep命令,该命令将搜索包含2的行。听起来您可能想做以下事情:
cmd | grep "type"
如果输出严格限制为“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
如果输出严格限制为“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
下面是一个简单的sed解决方案,它使用正则表达式查找字符串中的数字:
cmd | sed 's/^.*type: \([0-9]\+\)/\1/g'
表示从一开始^
可以是任何字符(也可以是无字符)*
是数字(至少一个字符)\([0-9]\+\)
意味着它使用它找到的第一个模式(仅在本例中)并将其用作整个字符串的替换\1
- 这里是一个简单的sed解决方案,它使用正则表达式来查找字符串中的数字:
cmd | sed 's/^.*type: \([0-9]\+\)/\1/g'
表示从一开始^
可以是任何字符(也可以是无字符)*
是数字(至少一个字符)\([0-9]\+\)
意味着它使用它找到的第一个模式(仅在本例中)并将其用作整个字符串的替换\1
sed
。。。给我一点时间。顺便说一句,你看没有人知道这个细节。你应该强化你的问题。对了,我知道如何使用cut。无论如何,非常感谢???对不起,这是有意义的!如何处理输出中的多行?您正在接受并向上投票实际上是最糟糕的答案。输入:1000只是输出的许多行中的一行。所以我想我要匹配准确的模式,然后提取它后面的字符串。谢谢。啊,好的。。然后我会使用sed
。。。给我一点时间。顺便说一句,你看没有人知道这个细节。你应该强化你的问题。对了,我知道如何使用cut。无论如何,非常感谢???对不起,这是有意义的!如何处理输出中的多行?您正在接受并向上投票实际上是最糟糕的答案。输入:1000只是输出的许多行中的一行。所以我想我要匹配精确的模式,然后提取它后面的字符串。谢谢。为什么不直接使用awk
cmd | awk'/type:[0-9]+/{print$3;exit}
grep
尤其是egrep
是不需要的。但是,我仍然会使用sed
您不应该使用旧的和过时的背景标记,像这样使用括号$(code)
输出=$(cmd | awk-F':''/type:[0-9]+/{print$2}')@jotne-the-op-d