我有一个 CSV 文件,如下所示:
keyuat,carsim,logs-keyuat-carsim
lowuat,carsimserver,logs-lowuat-carsimserver
utils,dash,logs-utils-dash
utils,lifecycle,logs-utils-lifecycle
utils,lifecycle-nodejs,logs-utils-lifecycle-nodejs
workshop,cashier,logs-workshop-cashier
workshop,jfrog-dotnet,logs-workshop-jfrog-dotnet
workshop,labelsengine,logs-workshop-labelsengine
基于此 CSV 文件,我正在尝试运行两个必须一起执行的命令:
oc project $1
oc patch dc $2 -p '{"metadata":{"labels":{"logentries":"$3"}}}'
使用上面的真实示例,命令将是:
oc project keyuat
oc patch dc carsim -p '{"metadata":{"labels":{"logentries":"logs-keyuat-carsim"}}}'
我一直在尝试使用 awk,但我总是发现特殊字符或 /r 无效字符的问题,我没有看到。如果不是system
我使用print
,我会看到我的一些字符在行首重叠而不是在最后添加:
awk -F , '{ cmd="oc project " $1 "\;" "\n" "oc patch dc " $2 " \-p '\''\{\"metadata\"\:\{\"labels\"\:\{\"logentries\"\:\"" $3"\""; print(cmd) }' ./csv/labels.csv
"}}}oject keyuat; oc patch dc carsim -p '{"metadata":{"labels":{"logentries":"logs-keyuat-carsim
"}}}oject lowuat; oc patch dc carsimserver -p '{"metadata":{"labels":{"logentries":"logs-keyuat-carsimserver
"}}}oject utils; oc patch dc dash -p '{"metadata":{"labels":{"logentries":"logs-utils-dash
awk -F , '{ cmd="oc project " $1 "\;" "oc patch dc " $2 " -p '\''\{\"metadata\"\:\{\"labels\"\:\{\"logentries\"\:\"" $3 "\"\}\}\}'\''"; system(cmd) }' ./csv/labels.csv
awk: cmd. line:1: warning: escape sequence `\;' treated as plain `;'
awk: cmd. line:1: warning: escape sequence `\{' treated as plain `{'
awk: cmd. line:1: warning: escape sequence `\:' treated as plain `:'
awk: cmd. line:1: warning: escape sequence `\}' treated as plain `}'
Already on project "keyuat" on server "https://test-ocp.exampleusage.eu:443".
Error from server (BadRequest): invalid character '\r' in string literal
Already on project "lowuat" on server "https://test-ocp.exampleusage.eu:443".
Error from server (BadRequest): invalid character '\r' in string literal
Now using project "utils" on server "https://test-ocp.exampleusage.eu:443".
Error from server (BadRequest): invalid character '\r' in string literal
如何更正此脚本?
我会用
要检查命令的内容:
在 awk 中,您可以使用以下命令轻松打印单引号:\047
你可以试试(我只是在这里输入,我现在无法测试......我希望它是正确的!)
假设输入文件是一个 Unix 文本文件,并且所有涉及的字段都是“不错的”(没有嵌入的逗号、引号或换行符,并且不需要任何特殊的 JSON 编码或 shell 中的额外引号),那么您可以这样做使用简单的 shell 循环:
这将创建一个命令流:
(等等)......它被传递给
sh -s
执行。同样,但现在使用真正知道如何解析 CSV、如何为 shell 引用字符串以及如何创建 JSON 的工具:
在这里,我们使用
mlr
(Miller) 将输入从 CSV 转换为基本的 JSON 文档。JSON 文档然后由 JSON 处理器解析,该处理器jq
创建包含带引号的字符串和格式正确的 JSON 的 shell 代码。输出sh -s
像以前一样被发送到执行。对于像这样的输入行
这将生成并执行这两个命令