我有一个专有命令,需要五 (5) 个输入才能正确执行该命令。
command -cval <value> -tval <value> -dval <value> -kval <value>
我需要能够通过逐行读取配置文件中的条目来运行此命令,以便当给我提供这 5 个值的新要求时,我可以简单地在配置文件的底部附加一行新数据,重新运行脚本。简单吧???
我的配置文件设置为带有“GROUP”前缀,因此我可以通过这种方式仅 grep 文件中包含“GROUP”的行,以便可以以要处理的相同格式轻松地将新条目添加到配置文件中(不确定这是一个好主意):
## ORIG CONFIG FILE ##
cval, tval, dval, mval, kval
cval, tval, dval, mval, kval
cval, tval, dval, mval, kval
...
## GROUP APPENDED CONFIG FILE ##
GROUP, cval, tval, dval, mval, kval
GROUP, cval, tval, dval, mval, kval
GROUP, cval, tval, dval, mval, kval
...
请注意:配置文件中的这些值可能是重复的,这就是我希望逐行处理它们的原因。另外,我可以随意设置配置文件,所以请随时告诉我为什么这种方式是或不是最佳的。
我的问题:如何在循环中运行命令来处理我的数据,如下所示:
LOOP1(第一行)命令 cval、tval、dval、mval、kval
LOOP2(第二行)命令 cval、tval、dval、mval、kval
LOOP3(第三行)命令 cval、tval、dval、mval、kval
...等等,等等,循环配置文件中的每一行。
答案1
给定这个文件:
$ cat input
GROUP, cval1, tval1, dval1, mval1, kval1
DISREGARD, you, should, not, parse, this, line
GROUP, cval2, tval2, dval2, mval2, kval2
GROUP, cval3, tval3, dval3, mval3, kval3
并给出这个脚本:
#!/bin/bash
awk -F, '/^GROUP/ {print $2,$3,$4,$5,$6}' input | while read c t d m k; do
echo -cval $c -tval $t -dval $d -mval $m -kval $k
done
我们得到这个结果:
$ ./go.sh
-cval cval1 -tval tval1 -dval dval1 -mval mval1 -kval kval1
-cval cval2 -tval tval2 -dval dval2 -mval mval2 -kval kval2
-cval cval3 -tval tval3 -dval dval3 -mval mval3 -kval kval3
替换echo
为您的专有命令,您应该已准备就绪。
答案2
grep '^GROUP' input | parallel --col-sep ', *' -- \
/bin/echo -cval {2} -tval {3} -dval {4} -mval {5} -kval {6}
输出:
-cval cval1 -tval tval1 -dval dval1 -mval mval1 -kval kval1
-cval cval2 -tval tval2 -dval dval2 -mval mval2 -kval kval2
-cval cval3 -tval tval3 -dval dval3 -mval mval3 -kval kval3
替换/bin/echo
为您的实际命令。
答案3
sed
方法:
sed -n '/^GR/{s/^GROUP/command/
s/,/-c/
s/,/-t/
s/,/-d/
s/,/-m/
s/,/-k/
s/-./ &val /gp}' input
输出(给定内容在OP):
command -cval cval -tval tval -dval dval -mval mval -kval kval
command -cval cval -tval tval -dval dval -mval mval -kval kval
command -cval cval -tval tval -dval dval -mval mval -kval kval
要实际运行输出(仔细检查其中是否有任何错误代码后),请更改gp
(g
洛巴尔林特p
) 末尾为ge
(g
局部e
评估)。