【问题标题】:shell: Extract key value from a string with known keyshell:从具有已知键的字符串中提取键值
【发布时间】:2015-10-27 12:35:01
【问题描述】:

我有一个脚本,其中运行以下命令:

OUTPUT=`echo "User-Name=$username,User-Password=$passwd" | radclient $ip auth $key`
echo $OUTPUT

执行命令后,我在OUTPUT 中得到以下结果。

Received response ID 239, code 2, length = 34
        Reply-Message = "Hello, root"

然后我检查OUPUT是否包含“code”

if grep -wq code <<< $OUTPUT; then    
    echo "Success"
    break;
fi

这也有效。

现在如果我的 OUTPUT 变量包含 code 那么我想提取代码值:2(在上述情况下)

如何实现:

所以输入:

Received response ID 239, code 2, length = 34
            Reply-Message = "Hello, root"

输出:2

【问题讨论】:

    标签: linux bash shell sed grep


    【解决方案1】:
    echo $OUTPUT | sed -n 's/.*code \([^,]\+\),.*/\1/p'
    

    【讨论】:

    • 这也意味着您不需要grep。该命令的输出将是代码,如果有,则没有。
    【解决方案2】:

    您可以直接在 bash 中执行此操作,它支持正则表达式,在您的情况下,它可以是这样的:

    read A < <(echo 'Received response ID 239, code 2, length = 34')
    if [[ "$A" =~ ^Received\ response\ ID\ [0-9]+,\ code\ ([0-9]+),\ length\ =\ ([0-9]+) ]]; then echo ${BASH_REMATCH[1]} - ${BASH_REMATCH[2]}; else echo nope; fi
    

    【讨论】:

      【解决方案3】:
      echo "${OUTPUT}" | sed -e '/.*, code \([^,]\{1,\}\).*/ !d' -e 's//\1/'
      

      posix 兼容,因此适用于任何最近的 sed

      【讨论】:

        猜你喜欢
        • 2021-02-16
        • 2020-01-04
        • 1970-01-01
        • 2016-06-24
        • 1970-01-01
        • 1970-01-01
        • 2021-01-18
        • 1970-01-01
        相关资源
        最近更新 更多