AWK:AWK(两种模式之间的打印)无法按预期工作

时间:2014-07-30 19:34:15

标签: regex bash awk

我尝试过搜索但未找到我正在寻找的答案。对于这种情况,我有以下脚本:

#!/bin/bash

CONN="mysql://username:password1@hostname/database_name"

echo "Connection:\t${CONN}"

PW=$(echo ${CONN} |awk '/username:/,/@/')
echo "Username:\t${PW}"

我试图将PW的新变量设置为password1的值。

我有什么遗失的东西吗?

5 个答案:

答案 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或更新版