我试图从配置文件中提取两个值并将它们写入新文件。困难的部分是我希望新文件的名称由输入文件中的值之一确定。
我试图提取的值是“Build_Version”和 Docker 名称的四个字母缩写词(“docker_Name”)。例如,如果文件显示docker_Name='bcbs_pr-app-01'
,我只需要“bcbs”。我想将它们写入具有构建名称的文件,例如bcbs_build.txt
.
以下是日志文件的摘录:
nonSSL_port=80 # FOR STAGING
Build_Type=prod
Build_Version=9.0.00.01_134143
docker_Name='bcbs-pr-app-01'
所需的文件输出是
bcbs
9.0.00.01_134143
我想出了一个sed
可以提取我想要的值的命令
sed -n -e '/Build_Version=/p' -e '/docker_Name=/p' environment-info.conf > build_version.txt
但这会完整提取Build_Version=
和行,而我只需要 Build_Version 和 docker name 值。docker_Name=
我仍然需要弄清楚如何使用四个字母的 Docker 名称首字母缩略词 (bcbs) 来命名该文件。
答案1
该文件看起来像sh
语法。因此,如果该文件确实是要在sh
脚本中获取的配置文件,只需执行以下操作:
. ./environment-info.conf &&
printf '%s\n' "${docker_Name%%-*}" "$Build_Version" > "${docker_Name%%-*}_build.txt"
答案2
1) 将sed
, 替换为 a) 删除 的第一个单引号docker_Name
,b) 删除-pr-app-01'
(包括最后一个单引号),c) 删除该<value>=
部分:
sed -n "/Build_Version=/s/.*=//p;/docker_Name=/s/.*=//;s/'//;s/-.*//p"
where/match/s/pattern/replacement/
替换pattern
为replacement
at match
ing 行。如果replacement
是空字符串,则它会被有效删除。请注意,我从单引号切换到双引号来处理字符串中的单引号,并且您可以使用通配符* .
来匹配更复杂的字符串并将sed
命令与分号组合起来。
2)我们将两个结果作为BASH
数组读入:
values=( $( sed -n "/Build_Version=/s/.*=//p;/docker_Name=/s/.*=//;s/'//;s/-.*//p" file ) )
地点array=( value1 value2 value3 )
和$(do this command)
3)我们使用该数组来达到我们的目的,请注意计数器从以下位置开始0
:
echo ${values[1]} > ${values[1]}
echo ${values[0]} >> ${values[1]}
我们通过数组名称和条目的索引来寻址数组的条目${array[intex]}
。
答案3
你必须用sed
这个吗?grep
并且perl
可以做你需要的事情。
grep 'Build_Type\|docker_Name' environment-info.conf | perl -pe "s|docker_Name='(.*?)-.*|docker_Name=\1|" > build_version.txt
答案4
您正在寻找一种使用 docker 名称中的四个字母来命名文件的方法。这可以通过以下命令来实现,该命令会将四个字母分配给名为 File_Name 的变量。
File_Name=`cat file | grep "docker_Name" | awk -F"'" '{print $2}' | awk -F'-' '{print $1}'`
正如上面的答案中提到的,下面的命令会将 docker_Name 和 build_version 分配给一个名为 value 的数组:
values=($(sed -n "/docker_Name=/s/.*=//;s/'//;s/-.*//p;/Build_Version=/s/.*=//p" file))
我们以相反的顺序访问数组,以按照您想要的方式捕获输出:
for i in 1 0; do echo ${values[$i]} >> $File_Name.txt; done
文件将准备好您想要的名称,并且 cat 将显示其内容:
% cat bcbs.txt
bcbs
9.0.00.01_134143