在数据库条目中获取密码和salt

时间:2014-04-01 03:06:01

标签: bash grep

如果我有:

(1, 'username', '9787b9f43503ef4a5264865a97beb826', 'VdJt1S6R', 'z7WHG1tHg9cDWY9VWKawOu2b2KKyPkQji7oXghdhL68ZIqrTzn')

如何获得格式:

9787b9f43503ef4a5264865a97beb826:VdJt1S6R

我需要使用grep来执行此操作,并且将有多个数据库条目。

4 个答案:

答案 0 :(得分:0)

您可以使用GNU grep从输入中获取需求信息,但很难将其重新组织为9787b9f43503ef4a5264865a97beb826:VdJt1S6R

grep -Po "(?<=username',).*(?='[^']*')" file

 '9787b9f43503ef4a5264865a97beb826', 'VdJt1S6R',

使用其他工具,例如awk/sed,它可以生成您期望的格式,但似乎只修复了grep命令。

答案 1 :(得分:0)

单独使用grep这会非常麻烦。我可能会选择

awk -F "'" '{printf "%s:%s\n", $4, $6}'

这是使用'作为字段分隔符,因此对输入数据做出强有力的假设。

$ echo "(1, 'username', '9787b9f43503ef4a5264865a97beb826', 'VdJt1S6R', 'z7WHG1tHg9cDWY9VWKawOu2b2KKyPkQji7oXghdhL68ZIqrTzn')" | awk -F "'" '{printf "%s:%s\n", $4, $6}'
9787b9f43503ef4a5264865a97beb826:VdJt1S6R
$ 

或者,您可以考虑使用纯语句,因为您拥有有限的工具集。类似的东西:

while IFS=", " read -a A; do echo "${A[2]//\'}:${A[3]//\'}"; done

这将从stdin一个接一个地读取数组A,并在,上分开。对于每一行,它以您想要的格式回显所需的字段,删除'个字符:

$ echo "(1, 'username', '9787b9f43503ef4a5264865a97beb826', 'VdJt1S6R', 'z7WHG1tHg9cDWY9VWKawOu2b2KKyPkQji7oXghdhL68ZIqrTzn')" | \
> while IFS=", " read -a A; do echo "${A[2]//\'}:${A[3]//\'}"; done
9787b9f43503ef4a5264865a97beb826:VdJt1S6R
$ 

如果您必须使用grep,那么您可能也需要其他工具。例如,您可以使用grep提取所需信息,然后使用tr对其进行格式化:

$ echo "(1, 'username', '9787b9f43503ef4a5264865a97beb826', 'VdJt1S6R', 'z7WHG1tHg9cDWY9VWKawOu2b2KKyPkQji7oXghdhL68ZIqrTzn')" | \
> grep -oE "[[:xdigit:]]{32}', '[^']{8}" | \
> tr -s ", '" :
9787b9f43503ef4a5264865a97beb826:VdJt1S6R
$

答案 2 :(得分:0)

要建议稍微不同的方法,以下内容会将您古怪的输入重新格式化为冒号分隔;

sed "s/^(//;s/'*, '*/:/g;s/')$//" wackyfile

为了便于携带,我添加了'*而不是更正确的'\?,因为有些sed方言不支持,而其他一些方法则要求您省略反斜杠。 *量词在任何地方都是一样的。如果您的sed支持-r选项,则可能需要使用该选项,并相应地调整正则表达式。

现在,您可以通过管道cut -d: -f3-4获取所需的两个字段。

答案 3 :(得分:0)

这应该做:

awk -F\' '{print $4":"$6}' file
9787b9f43503ef4a5264865a97beb826:VdJt1S6R