我需要从配置文件中获取 1 个或多个位置,然后检查每个位置的某些文件。我有一个 AWK 和 SED 组合,可以找到位置,然后从文本文件中读取文件列表。我想检查文件的每个位置,并考虑使用 bash 数组来保存这些位置。
但是由于某种原因,我无法从 AWK 语句中填充数组。在我看来,它将完整内容加载到第一个元素中。
如果我手动填充数组,它可以工作;例如,将行 array=$(awk ... 替换为
array[1]=/docs01/objdata/admin/p1dig
array[2]=/docs02/objdata/admin/p1dig
array[3]=/docs03/objdata/admin/p1dig
array[4]=/docs04/objdata/admin/p1dig
在下面的代码片段中,我删除了外部(文件名)循环并添加了一些调试上下文。
#!/bin/bash
declare -a array
OBJECTIVE_CONF=/u01/app/objective/perf/DOS1/config/objConf.xml
FILE=/tmp/DoS1_files.dsv
# IFS=$"/n"
array=$(awk '/<volume>/,/<\/volume>/' $OBJECTIVE_CONF | grep "<path>" | sed "s#<[/]*path>##g" | sed 's/^[ \t]*//' |sed 's/[ \t]*$//' )
element_count=${#array[@]}
echo "element_count is : $element_count "
echo "index is: $index"
echo "${array[$index]}"
echo "filename loop"
index=0
while [ "$index" -lt "$element_count" ]
do
let "index = $index + 1"
echo "index is: $index"
echo "ls ${array[$index]}/filename_from_loop"
done
echo "leaving loop"
从命令行运行时,Awk 语句给了我预期的结果。我 AWK 用于开始和结束 XML 标记,在 PATH 中使用 grep 并使用 SED 删除 PATH exm 标记以及前导和训练空间。
bash-3.00$ awk '/<volume>/,/<\/volume>/' $OBJECTIVE_CONF | grep "<path>" | sed "s#<[/]*path>##g" | sed 's/^[ \t]*//' |sed 's/[ \t]*$//'
/docs01/objdata/admin/p1dig
/docs02/objdata/admin/p1dig
/docs03/objdata/admin/p1dig
/docs04/objdata/admin/p1dig