【问题标题】:Extract grep match with sed使用 sed 提取 grep 匹配项
【发布时间】:2014-05-14 01:45:52
【问题描述】:

我正在尝试运行以下命令:

echo $line | grep "u01/app/[0-9]" | sed -n 's/[0-9]|\./p'

在哪里

line="orb 14171 orb 3u REG 253,3 0 14141 /u01/app/11.2.0.4/broa/log/stm1025/agent/"

我想做的是提取版本号,并将其存储在一个变量中,但是每当我运行上述命令时,我似乎都得到了它 sed: command garbled: s/[0-9]p

有人知道怎么回事吗?

【问题讨论】:

  • 你喜欢输出的值是多少?

标签: unix sed grep


【解决方案1】:

假设你有 bash 和 GNU grep:

version=$(grep -oP '(?<=/u01/app/).+?(?=/)' <<< "$line")
echo "$version"    # => 11.2.0.4

PCRE 正则表达式查找/u01/app/ 和下一个/ 之间的所有字符

【讨论】:

    【解决方案2】:

    当我运行你的 sed 命令时,我的 sed 会告诉你:

    sed -n 's/[0-9]|\./p'
    sed: 1: "s/[0-9]|\./p": unterminated substitute in regular expression
    

    这是因为你没有做一个完整的替换命令,替换命令的语法如下:s/…/…/ 而你只做了s/…/

    你可以尝试,坚持使用 sed:

    echo $line | sed -e 's,.*/u01/app/\([0-9\.]*\)*/.*,\1,'
    11.2.0.4
    

    【讨论】:

    • [0-9.] 应该足够了,课堂上不需要转义点。 + 可能比* 更适合版本提取。另一种选择是[^/]\{1,\}
    【解决方案3】:

    你可以试试awk

    ver=$(awk -F/ '/u01\/app\/[0-9]/ {print $4}' <<< "$line")
    echo "$ver"
    11.2.0.4
    

    它从变量line中取出第四个字段并将其存储到变量ver

    如果变量中只有一行,可以跳过测试直接使用:

    ver=$(awk -F/ '{print $4}' <<< "$line")
    

    简单易懂,直接给出值即可。没有复杂的正则表达式:)

    【讨论】:

    • 由于-F/ 标记为字段分隔符,它不会改变任何内容
    • 太棒了!那么它是从“/u01\/app\/[0-9]/”部分开始的吗?
    • 不,$1 将是 orb 14171 orb 3u REG 253,3 0 14141 (在第一个分隔符之前) -- /u01\/app\/[0-9]/ 部分只是要匹配的模式,它没有锚定到行首
    • @AkshaiShah 不,它将文件分割为/。所以第四个字段还是11.2.0.4
    猜你喜欢
    • 2013-09-09
    • 2013-11-28
    • 2017-05-30
    • 2019-08-03
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多