从包含ANSI转义属性的gitlab-runner输出parsing标记值

目前我试图从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} )与等号的正常组合不起作用?


原始的Gitlab-Runner输出

 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 

部分Hexdump 更新

 ... 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}