用sed提取grep匹配

时间:2014-05-13 17:35:32

标签: unix sed grep

我正在尝试运行以下内容:

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:命令乱码:s/[0-9]p

任何人都知道什么是错的?

3 个答案:

答案 0 :(得分:2)

假设你有bash和GNU grep:

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

您可以尝试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")

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