我尝试过搜索但未找到我正在寻找的答案。对于这种情况,我有以下脚本:
#!/bin/bash
CONN="mysql://username:password1@hostname/database_name"
echo "Connection:\t${CONN}"
PW=$(echo ${CONN} |awk '/username:/,/@/')
echo "Username:\t${PW}"
我试图将PW的新变量设置为password1的值。
我有什么遗失的东西吗?
答案 0 :(得分:2)
你在这里不需要awk。 Just BASH足够好了:
conn="mysql://username:password1@hostname/database_name"
[[ "$conn" =~ username:(.*)@ ]] && pw="${BASH_REMATCH[1]}"
echo "$pw"
password1
答案 1 :(得分:2)
就这样做:
TMP="${CONN##*:}" //Delete all characters from the head till the last ':'
CONN="${TMP%%@*}" //Delete all characters from the tail till the last '@'
你在CON
中有密码1答案 2 :(得分:0)
就个人而言(可能不是最佳选择),我会使用cut
:
PW=$(echo -e ${CONN} | cut -d":" -f3 | cut -d"@" -f1)
运行它会产生:
Connection: mysql://username:password1@hostname/database_name
Username: password1
注意:如果您要在\
中使用echo
,请确保使用-e
选项
答案 3 :(得分:0)
您尝试使用的语法:
awk '/username:/,/@/'
会在包含username
的LINE和包含@
的LINE之间找到LINES。它不是要在一行内的分隔符之间找到一个字符串。尝试:
sed 's/.*username:\(.*\)@.*/\1/'
代替。它并不健壮,但它可能就是您需要的所有特定输入。
恕我直言,你应该使用@ Ko2r的解决方案。
答案 4 :(得分:0)
另一个Bash:
CONN="mysql://username:password1@hostname/database_name"
IFS=:@ read UN PW __ <<< "${CONN#*//}"
echo "$UN" ## Outputs username
echo "$PW" ## Outputs password1
兼容性:Bash 2.05b或更新版