如何从Unix shell变量中提取与模式匹配的子字符串

时间:2009-05-20 15:46:13

标签: regex unix shell sed grep

我对Unix shell脚本比较陌生。这是我的问题。我用过这个脚本......

isql -S$server -D$database -U$userID -P$password << EOF > $test
exec MY_STORED_PROC
go
EOF

echo $test

要生成此结果......

Msg 257, Level 16, State 1:
Server 'MY_SERVER', Procedure 'MY_STORED_PROC':
Implicit conversion from datatype 'VARCHAR' to 'NUMERIC' is not allowed.  Use
the CONVERT function to run this query.
(1 row affected)
(return status = 257)

我想提取“257”并将其粘贴到另一个变量中,而不是回显isql输出,所以我可以从脚本中返回257。我在想某种sed或grep命令可以做到这一点,但我真的不知道从哪里开始。

有什么建议吗?

2 个答案:

答案 0 :(得分:13)

bash可以从shell变量的内容中删除部分。

${parameter#pattern}返回$参数的值,而不是匹配pattern的开头的部分。

${parameter%pattern}返回$参数的值,而不包含与pattern匹配的部分。

我想有更好的方法可以做到这一点,但这应该有效。 所以你可以把它结合到:

% strip the part before the value:
test=${test#Msg }
% strip the part after the value:
test=${test%, Level*}
echo $test

如果您对(return status = xxx)部分感兴趣,那就是:

result=${test#*(result status = }
result=${result%)*}
echo $result

bash联机帮助页的相关部分是“参数扩展”。

答案 1 :(得分:2)

这是一个快速而又脏的黑客,虽然你应该自己开始学习这些东西:

RC=`tail -1 $test |sed 's/(return status = \([0-9]\+\))/\1/'`