grep从字符串使用正则表达式的确切值?

时间:2019-04-07 08:58:49

标签: regex grep

我正在鬼混一些docker容器,我想知道如何从日志中获取在容器创建时生成的密码。

所以我用

运行容器
$> docker container run --name mysql -p 3306:3306 -e MYSQL_RANDOM_ROOT_PASSWORD=yes -d mysql

此命令使用随机生成的密码启动一个新的mysql容器,我可以从日志中获取该密码。确切地说,此命令可以通过以下命令:

$> docker container logs mysql
...
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
GENERATED ROOT PASSWORD: Poow3eet2aat6aePhae6leipeecagife

2019-04-07T08:00:18.945238Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.15)  MySQL Community Server - GPL.

那只是一个背景。自然,重要的部分是GENERATED ROOT PASSWORD行,您可以假设我实际上是从任何其他来源获得此文本文件的。我想将其存储在某些变量中,例如

export ROOT_PASS=$(expression)

为此,我需要提供仅返回随机生成的字符串的表达式。当然,也可以只将正则表达式模式的匹配子字符串分配给变量。

我想到了

docker container logs mysql | grep -e "PASSWORD: .*"

,但这实际上是整行结果,并突出显示PASSWORD: Poow3eet2aat6aePhae6leipeecagife。我还想到了sed:

docker container logs mysql | sed -e 's/PASSWORD: .*/$1/g'

...但是这剥去了有趣的部分,实际上还返回了其他所有内容。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

附加GNU grep:

| grep -Po 'GENERATED ROOT PASSWORD: \K.*'

或GNU sed:

| sed -n 's/^GENERATED ROOT PASSWORD: //p'

输出:

Poow3eet2aat6aePhae6leipeecagife

请参阅:What does '\K' mean in this regex?