将输出转换为数组,然后提取值进行循环
Convert output to arrays then extract values to loop
我希望输出结果到 grep 第二和第三列:
1 db1 ADM_DAT 300 yes 95.09
2 db2 SYSAUX 400 yes 94.52
并将它们转换为数组,例如:
outputres=("db1 ADM_DAT" "db2 SYSAUX")
然后能够在循环中读取这些值,例如:
for i in "${outputres[@]}"; do read -r a b <<< "$i"; unix_command $(cat file|grep $a|awk '{print }') $a $b;done
文件:
10.1.1.1 db1
10.1.1.2 db2
最终预期:
unix_command 10.1.1.1 db1 ADM_DAT
unix_command 10.1.1.2 db2 SYSAUX
这只是一个理论上的例子,我不确定它是否有效。
我会使用简单的 bash while read
并使用 +=
语法将元素添加到数组中:
outputres=()
while read -r _ a b _; do
outputres+=("$a $b")
done < file
这样做,使用你的输入文件,我得到:
$ echo "${outputres[@]}" #print all elements
db1 ADM_DAT db2 SYSAUX
$ echo "${outputres[0]}" #print first one
db1 ADM_DAT
$ echo "${outputres[1]}" #print second one
db2 SYSAUX
既然你想分别使用这两个值,那么使用关联数组可能会更好:
$ declare -A array=()
$ while read -r _ a b _; do array[$a]=$b; done < file
然后您可以循环遍历这些值:
$ for key in ${!array[@]}; do echo "array[$key] = ${array[$key]}"; done
array[db2] = SYSAUX
array[db1] = ADM_DAT
查看使用这些数组的基本示例:
#!/bin/bash
declare -A array=([key1]='value1' [key2]='value2')
for key in ${!array[@]}; do
echo "array[$key] = ${array[$key]}"
done
echo ${array[key1]}
echo ${array[key2]}
所以也许这可以解决您的问题:循环遍历包含列的文件,获取第二个和第三个并使用它们两次:首先是 $a 在 file
中执行 grep,然后作为参数 cmd_command
:
while read -r _ a b _
do
echo "cmd_command $(awk -v patt="$a" '[=15=]~patt {print }' file) $a, $b"
done < columns_file
示例文件file
:
$ cat file
hello this is db1
and this is another db2
我得到了这个输出(注意我只是 echo
ing):
$ while read -r _ a b _; do echo "cmd_command $(awk -v patt="$a" '[=17=]~patt {print }' file) $a, $b"; done < a
cmd_command hello db1, ADM_DAT
cmd_command and db2, SYSAUX
我希望输出结果到 grep 第二和第三列:
1 db1 ADM_DAT 300 yes 95.09
2 db2 SYSAUX 400 yes 94.52
并将它们转换为数组,例如:
outputres=("db1 ADM_DAT" "db2 SYSAUX")
然后能够在循环中读取这些值,例如:
for i in "${outputres[@]}"; do read -r a b <<< "$i"; unix_command $(cat file|grep $a|awk '{print }') $a $b;done
文件:
10.1.1.1 db1
10.1.1.2 db2
最终预期:
unix_command 10.1.1.1 db1 ADM_DAT
unix_command 10.1.1.2 db2 SYSAUX
这只是一个理论上的例子,我不确定它是否有效。
我会使用简单的 bash while read
并使用 +=
语法将元素添加到数组中:
outputres=()
while read -r _ a b _; do
outputres+=("$a $b")
done < file
这样做,使用你的输入文件,我得到:
$ echo "${outputres[@]}" #print all elements
db1 ADM_DAT db2 SYSAUX
$ echo "${outputres[0]}" #print first one
db1 ADM_DAT
$ echo "${outputres[1]}" #print second one
db2 SYSAUX
既然你想分别使用这两个值,那么使用关联数组可能会更好:
$ declare -A array=()
$ while read -r _ a b _; do array[$a]=$b; done < file
然后您可以循环遍历这些值:
$ for key in ${!array[@]}; do echo "array[$key] = ${array[$key]}"; done
array[db2] = SYSAUX
array[db1] = ADM_DAT
查看使用这些数组的基本示例:
#!/bin/bash
declare -A array=([key1]='value1' [key2]='value2')
for key in ${!array[@]}; do
echo "array[$key] = ${array[$key]}"
done
echo ${array[key1]}
echo ${array[key2]}
所以也许这可以解决您的问题:循环遍历包含列的文件,获取第二个和第三个并使用它们两次:首先是 $a 在 file
中执行 grep,然后作为参数 cmd_command
:
while read -r _ a b _
do
echo "cmd_command $(awk -v patt="$a" '[=15=]~patt {print }' file) $a, $b"
done < columns_file
示例文件file
:
$ cat file
hello this is db1
and this is another db2
我得到了这个输出(注意我只是 echo
ing):
$ while read -r _ a b _; do echo "cmd_command $(awk -v patt="$a" '[=17=]~patt {print }' file) $a, $b"; done < a
cmd_command hello db1, ADM_DAT
cmd_command and db2, SYSAUX