Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何使用sed提取字符串_Shell_Sed - Fatal编程技术网

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
        意味着它使用它找到的第一个模式(仅在本例中)并将其用作整个字符串的替换

      type:1000只是输出的许多行中的一行。所以我想我要匹配准确的模式,然后提取它后面的字符串。谢谢。啊,好的。。然后我会使用
      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