目前我试图从gitlab-runner list
捕获一个令牌,输出如下所示:
Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml Ursain Bolt Executor=docker Token=abcdef678901234567890123456789 URL=https://my.gitlab.com
我正在寻找一个令牌的存在: Token=abcdef678901234567890123456789
。
我尝试了几种模式(我熟悉正则expression式),我喜欢使用的外观如下:
gitlab-runner list 2>&1 >/dev/null | grep -E 'Token=[a-f0-9]{30}'
我将stderrredirect到标准输出,因为它似乎
gitlab-runner
打印到标准输出。 不用pipe道stdout
到/dev/null
在这里没有什么区别。
这种模式不匹配。
我试过成功(grep返回0
)以下匹配:
[a-f0-9]+
([a-f0-9])+'
([a-f0-9]){30}
Token
Token.
但是,下面的匹配不起作用(grep返回1
):
(Token.[a-f0-9]){30}
Token=[a-f0-9]{30}
Token=
Token\=
我错过了什么,为什么两个模式( Token
和[a-f0-9]{30}
)与等号的正常组合不起作用?
bash-4.3# gitlab-runner list 2>&1 >/dev/null Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml Ursain Bolt Executor=docker Token=abcdef678901234567890123456789 URL=https://my.gitlab.com
... 000000a0: 2045 7865 6375 746f 721b 5b30 3b6d 3d64 Executor.[0;m=d 000000b0: 6f63 6b65 7220 546f 6b65 6e1b 5b30 3b6d ocker Token.[0;m 000000c0: 3d65 6466 3834 3062 3436 6166 6434 3333 =edf840b46afd433 ...
bash-4.3# cat /etc/alpine-release 3.6.2 bash-4.3# bash --version GNU bash, version 4.3.48(1)-release (x86_64-alpine-linux-musl) bash-4.3# grep --version grep (GNU grep) 3.0 Copyright (C) 2017 Free Software Foundation, Inc.
试图通过回显输出重现这似乎并不工作,grep符合预期的模式。
如果您正在使用GNU grep
使用随附的PCRE库。 -P
标志启用它, -o
标志只返回比整行更匹配的组。 \K
是一个保留字符,表示忽略匹配字符串中的字符串。
grep -Po 'Token=\K[a-f0-9]{30}'
grep -E 'Token=[a-f0-9]{30}'
是,它将返回匹配正则表达式的整行,而不是单独的匹配组,因为你正在查找的字符串是一行的一部分也就是说。 你当然可以在原始表达式中使用-o
标志,但是它仍然会返回Token=abcdef678901234567890123456789
。
作为一个方面说明,你可能想确保在哪个输出流中你的Token=
string是可用的,因为通过你当前的重定向2>&1 > /dev/null
你将整个stdout
压缩到null流并且只重定向stderr
到控制台和grep
只是在行事。
所以如果你的问题是ANSI转义序列 ,你需要用sed
或你选择的任何工具清理你的输出,并应用grep
regex过滤器,类似于
gitlab-runner list 2>&1 >/dev/null | s/.\[0;m//g | grep -Po 'Token=\K[a-f0-9]{30}'
我提取了一个hexdump的输出结果(使用gitlab-runner list 2>&1 >/dev/null | xxd
[xxd应该和vim一起发货],结果gitlab-runner
增加了Ansi Escape Sequences .[0;m
before每一个等号:
... 000000a0: 2045 7865 6375 746f 721b 5b30 3b6d 3d64 Executor.[0;m=d 000000b0: 6f63 6b65 7220 546f 6b65 6e1b 5b30 3b6d ocker Token.[0;m 000000c0: 3d65 6466 3834 3062 3436 6166 6434 3333 =edf840b46afd433 ...
最终的工作模式是Token.{5}=[a-f0-9]{30}
。