我正在尝试获取仅包含 gitlab 运行者姓名的列表。
所以gitlab-runner list 2>&1
的输出是:
Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml
default_runner Executor=shell Token=251cda361f983e612b27381e2f73ad URL=http://10.6.20.230
test runner Executor=shell Token=86ab70918fc87c8a8d3a57c21457fb URL=http://10.6.20.230
请注意,运行者的名字中可以包含空格。
所以我尝试了以下方法:
gitlab-runner 列表 2>&1 | awk -F'Executor' '{if(NR>1)print $1}'
这给了我几乎我想要的东西(除了我需要删除的尾随空格)。
default_runner
test runner
但是,如果我将字段分隔符更改为 Executor=
以希望使其更明确,则它不再有效。它返回整行。
$ gitlab-runner list 2>&1 | awk -F'Executor=' '{if(NR>1)print $1}'
default_runner Executor=shell Token=251cda361f983e612b27381e2f73ad URL=http://10.6.20.230
test runner Executor=shell Token=86ab70918fc87c8a8d3a57c21457fb URL=http://10.6.20.230
我试过用 Executor\=
转义它,但无济于事。如何在拆分中包含等号?
编辑:
如果我使用其中一行并将其回显到 awk 中,它会起作用
$ echo "test runner Executor=shell Token=86ab70918fc87c8a8d3a57c21457fb URL=http://10.6.20.230" | awk -F'Executor=' '{print $1}'
test runner
另一件需要注意的事情是,无论出于何种原因,gitlab-runner list
都会打印到 stderr。这就是我在通过管道传输到 awk 之前重定向到 stdout 的原因。也许我没有正确重定向?但这并没有真正意义,因为 awk 在没有等号的情况下选择它。
最佳答案
不能在 Executor=
上拆分的原因当管道从 gitlab-runner
命令是因为Executor=
字符串不存在!至少不是那种形式 - gitlab-runner
添加一些 ANSI color codes (ESC[0;m
用于重置所有属性):
$ gitlab-runner list 2>&1 | cat -A
default_runner ^[[0;m Executor^[[0;m=shell Token=86ab70918fc87c...
# ^^^^^^ ^^^^^^ <-- ANSI color codes
为了证明这一点,尝试运行:
$ gitlab-runner list 2>&1 | awk -F 'Executor\x1b\\[0;m=' '{print $1}'
default_runner
有一个 open proposal在 gitlab-runner
中添加禁用颜色输出的选项,但它已经开放了 10 个月,没有太多社区支持。在他们决定添加该选项之前,如果您愿意,可以去除 ANSI 颜色代码,例如 this。或 this .
请注意,在 POSIX 中和 GNU awk
, -F
接受 ERE 表达式。所以,Executor=
一般应该可以工作(关于 =
没什么特别的)。要处理空格,可以使用 <space>*Executor=
:
$ cmd | awk -F ' *Executor=' 'NR>1 {print $1}' | cat -A
default_runner$
test runner$
关于bash - 仅按名称列出 Gitlab 运行器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46935757/