Joy*_*Joy 2 shell awk grep json sed
Jusk 就像我之前的帖子一样,我知道如何用空格解析简单的 json。
\n现在我还有一个问题是,如果我有多个模块结构,它们的键是相同的,但值是不同的,我希望输出值是每个模块中的值的组合,但实际上是最后一个模块中的值将覆盖前一个。
\n我的测试示例 JSON 如下:
\n{\n "WorkspaceName":"aaa bbb ccc ddd eee",\n "ReportFileName":"xxx yyy zzz",\n "StageName":"sit uat prod"\n},\n{\n "WorkspaceName":"1111 2222 3333 4444 5555",\n "ReportFileName":"6666 7777 8888",\n "StageName":"sit1 uat1 prod1"\n}\nRun Code Online (Sandbox Code Playgroud)\n我尝试过的 shell 脚本mian.sh如下:
InitialFile=$WORKSPACE/deployment/configuration/Initial.json\neval $(sed -n -e \'s/^.*"\\(.*\\)":\\(".*"\\).*$/\\1=\\2/p\' $InitialFile)\n\nConfigFile="$WorkspaceName"_"$ReportFileName"\n\necho The Config File is_$ConfigFile\nRun Code Online (Sandbox Code Playgroud)\n结果总是The Config File is_1111 2222 3333 4444 5555_6666 7777 8888,我想同时得到两个值:aaa bbb ccc ddd eee_xxx yyy zzz和1111 2222 3333 4444 5555_6666 7777 8888。
我该如何实现这一目标?
\n一些背景知识,以了解我为什么这样做以及我的一些限制\xef\xbc\x9a
\n我正在 jenkins 上执行我的管道,它将执行我的 mian.sh。所以条目是mian.sh。另外,jenkins服务器是由独立团队维护的,我们无法直接访问服务器,因此无法直接在服务器上运行shell代码。
\n另外,我需要组合变量,以便使用该变量来匹配相应配置文件的名称。不同的结果需要匹配不同的文件进行后续测试。
\n这个答案的要点:
jq所以采用awk这里的方法。awk方法,第二个是非 GNUawk方法,第三awk个是从 shell 脚本运行非 GNU代码。awk中运行的独立代码awkJenkins我发布了一个shell脚本,该脚本接受一个参数,该参数是要传递给它的Input_file名称。StageName=$(awk -v RS= ' 并将第三行代码的最后一行更改为' "$1")。第一个解决方案:使用您显示的示例,请尝试以下GNU awk代码。使用matchGNU 的函数awk,我使用正则表达式[[:space:]]+"WorkspaceName":"([^"]*)",\n[[:space:]]+"ReportFileName":"([^"]*)来获取所需的值,并从中创建 2 个捕获组,这两个捕获组进一步将值存储到一个名为arr稍后获取值的数组中,作为预先要求。
awk -v RS= '
{
while(match($0,/[[:space:]]+"WorkspaceName":"([^"]*)",\n[[:space:]]+"ReportFileName":"([^"]*)",/,arr)){
print arr[1]"_"arr[2]
$0=substr($0,RSTART+RLENGTH)
}
}
' Input_file
Run Code Online (Sandbox Code Playgroud)
第二个解决方案:使用您显示的示例,请尝试以下代码,应该可以在任何 POSIX awk 中工作。该解决方案也使用match函数,但它不创建数组,并且其中没有任何捕获组,因为捕获组功能是 GNU 的一部分awk。因此,split在这里使用函数来分割匹配的值并从中仅获取所需的部分。
awk -v RS= '
{
while(match($0,/[[:space:]]+"WorkspaceName":"[^"]*",\n[[:space:]]+"ReportFileName":"[^"]*",/)){
val=substr($0,RSTART,RLENGTH)
split(val,arr,"\"WorkspaceName\":\"|\"ReportFileName\":\"|,\n")
sub(/"$/,"",arr[2])
sub(/",$/,"",arr[4])
print arr[2]"_"arr[4]
$0=substr($0,RSTART+RLENGTH)
}
}
' Input_file
Run Code Online (Sandbox Code Playgroud)
要从 shell 脚本运行代码,请尝试:
#!/bin/bash
awk -v RS= '
{
while(match($0,/[[:space:]]+"WorkspaceName":"[^"]*",\n[[:space:]]+"ReportFileName":"[^"]*",/)){
val=substr($0,RSTART,RLENGTH)
split(val,arr,"\"WorkspaceName\":\"|\"ReportFileName\":\"|,\n")
sub(/"$/,"",arr[2])
sub(/",$/,"",arr[4])
print arr[2]"_"arr[4]
$0=substr($0,RSTART+RLENGTH)
}
}
' "$1"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |