【问题标题】:How to use sed to extract a string [duplicate]如何使用sed提取字符串[重复]
【发布时间】:2014-08-21 10:14:46
【问题描述】:

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

【问题讨论】:

    标签: shell sed


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您将您的问题标记为sed,但您的问题描述不限制其他工具,因此这里有一个使用awk 的解决方案。

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

      或者,您可以使用较新的$( ) 语法。有些人发现新语法更可取,它可以方便地嵌套,而无需转义反引号。

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

      【讨论】:

      • type: 1000 只是输出中的许多行之一。所以我想我想匹配确切的模式,然后提取它后面的字符串。谢谢。
      • 为什么不直接使用awkcmd | awk '/type : [0-9]+/ {print $3;exit}grep 尤其是 egrep 不是必需的。但是,我仍然会使用sed
      • 你不应该使用旧的和过时的反引号,使用括号$(code)就像这样output=$(cmd | awk -F':' '/type: [0-9]+/{print $2}')
      • @jotne op 没有提到他使用的是哪个 shell,我相信旧样式在 shell 之间更便携。如有错误请指正。
      • 据我发现以及其他人所写的,您需要一个非常古老且晦涩的系统才能没有括号。如果您有疑问,请将两者都发布并说最好使用括号。 (用谷歌搜索)
      【解决方案3】:

      这是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')
      

      【讨论】:

      • type: 1000 只是输出中的许多行之一。所以我想我想匹配确切的模式,然后提取它后面的字符串。谢谢。
      • 啊,好吧..那我会用sed...给我一秒钟。顺便说一句,你看没有人得到这个细节。你应该加强你的问题。
      • 对,我知道怎么用 cut 来做。还是非常感谢
      • ???抱歉,这让0 有意义! cut 如何处理输出中的多行?您实际上是在接受和支持最糟糕的答案
      【解决方案4】:

      如果输出严格限制为 "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】:

      您可以使用 |运算符将一个命令的输出发送到另一个命令,如下所示:

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

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

      cmd | grep "type"
      

      【讨论】:

        【解决方案6】:

        这个问题之前已经在这里分块回答过,大概是这样的:

        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 来满足您的需要。

        【讨论】:

          猜你喜欢
          • 2013-05-16
          • 2021-12-14
          • 2016-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-31
          • 1970-01-01
          • 2019-01-18
          相关资源
          最近更新 更多