我如何在外壳中进行for循环

时间:2018-10-18 16:41:20

标签: bash shell for-loop awk scripting

我的文件中包含以下内容:

[Class:ABCD_EFGH_IJK]
list.0=VALUE001*
list.1=VALUE002*
list.2=VALUE003*
list.3=VALUE004*
[Class:ABCD_EFGH_IJK:app:ABCD_EFGH_IJK]
condition=true

[Class:LMNO_PQRS_TUV]
list.0=VALUE004*
list.1=VALUE005*
list.2=VALUE006*
list.3=VALUE007*
[Class:LMNO_PQRS_TUV:app:LMNO_PQRS_TUV]
condition=true

我还有另一个脚本,该脚本使用类名和列表值作为参数运行。例如:

./myscript VALUE001* ABCD_EFGH_IJK

我需要使用一个for循环来遍历每个类并获取每个值来运行我的脚本。我该如何实现?

3 个答案:

答案 0 :(得分:2)

这是您要的:

$ awk -F'[]:=[]' '/Class:/{class=$3} /^list/{print $2, class}' file |
    xargs -n2 echo ./myscript
./myscript VALUE001* ABCD_EFGH_IJK
./myscript VALUE002* ABCD_EFGH_IJK
./myscript VALUE003* ABCD_EFGH_IJK
./myscript VALUE004* ABCD_EFGH_IJK
./myscript VALUE004* LMNO_PQRS_TUV
./myscript VALUE005* LMNO_PQRS_TUV
./myscript VALUE006* LMNO_PQRS_TUV
./myscript VALUE007* LMNO_PQRS_TUV

当您准备好实际调用echo时,请删除./myscript

答案 1 :(得分:0)

尝试一下:

首先,我使用awk并将配置文件转换为以下格式:

awk '/^\[/ { app=substr($0,2,length-2) } /=/ { print app "." $0 }' test.txt 
Class:ABCD_EFGH_IJK.list.0=VALUE001*
Class:ABCD_EFGH_IJK.list.1=VALUE002*
Class:ABCD_EFGH_IJK.list.2=VALUE003*
Class:ABCD_EFGH_IJK.list.3=VALUE004*
Class:ABCD_EFGH_IJK:app:ABCD_EFGH_IJK.condition=true
Class:LMNO_PQRS_TUV.list.0=VALUE004*
Class:LMNO_PQRS_TUV.list.1=VALUE005*
Class:LMNO_PQRS_TUV.list.2=VALUE006*
Class:LMNO_PQRS_TUV.list.3=VALUE007*
Class:LMNO_PQRS_TUV:app:LMNO_PQRS_TUV.condition=true

让我们在文件myconfig.txt上通话

现在您可以在其上编写一个for循环:

for i in `cat myconfig.txt`
do
if [[ ! $i == *"true"* ]]; then
val=`echo $i|cut -d'=' -f2`  #outputs VALUE001*
class=`echo $a|cut -d':' -f2|cut -d'.' -f1`  # outputs ABCD_EFGH_IJK
./myscript $val $class
fi
done

注意:这可能不是最好的解决方案,但这可以帮助您入门。 让我知道是否有帮助。

答案 2 :(得分:0)

sed中使用Hold空间的一个可怕示例(过于复杂)是

sed -nr '/\[Class:/ {s/\[Class:(.*)\]/\1/;h};/list/{G;s#.*=(.*)\n#./myscript \1 #p}' file

换句话说:
当您看到带有Class:的行时,将类名复制到Hold空间。 当看到带有list的行时,请将Hold空格(类名)附加到当前行,
并使用插入的换行符修改第一部分。
打印行。

当替换字符串具有#时使用\
()中记住的匹配字符串将通过\1进行调用。